zoukankan      html  css  js  c++  java
  • 使用Javah 生成C/C++头文件

    使用Javah 可以获取您的 Java 源文件并生成 C/C++头文件,其中包含您的 Java 代码中所有本地方法(native方法)的 JNI 存根(stub,C头文件)。如果您正在生成一个类的 JNI 存根,而且您已经把这个类定义为包的一部分,那么您 必须指定完全限定的类名。

    下面举例说明:

    使用eclipse建立一个工程假设工程路径为$ProjectPath,并且你已经定义了一个类,并且带包名:cn.com.comit.jni

     1 package cn.com.comit.jni;
     2  
     3 public class HelloJni {
     4      
     5     public native void displayHelloJni();
     6     static{
     7         System.loadLibrary("");
     8     }
     9  
    10     /**
    11      * @param args
    12      */
    13     public static void main(String[] args) {
    14         // TODO Auto-generated method stub
    15         new HelloJni().displayHelloJni();
    16     }
    17  
    18 }

    eclipse会自动帮你编译出一个字节码文件HelloJni.class,路径是$ProjectPathincncomcomitjni,很可能你会先cd到.class的目录这么做:

    >cd $ProjectPathincncomcomitjni

    >$ProjectPathin javah HelloJni

    发现执行出错:

    错误:无法访问 HelloJni
    错误的类文件: .HelloJni.class
    类文件包含错误的类: cn.com.comit.jni.HelloJni
    请删除该文件或确保该文件位于正确的类路径子目录中。

    看来是路径有问题咯。那改成

    javah cn.com.comit.jni.HelloJni

    再次运行,发现还是错误:

    错误:无法访问 cn.com.comit.jni.HelloJni
    未找到 cn.com.comit.jni.HelloJni 的类文件
    javadoc: 错误 - 找不到类 cn.com.comit.jni.HelloJni。

    怎么才能解决这个问题呢?其实只要cd到包的上一级目录(我们这里是$ProjectPathin)在运行下面的命令就搞定了:

    javah -classpath . cn.com.comit.jni.HelloJni

    看一下生成的C头文件:

     1 /* DO NOT EDIT THIS FILE - it is machine generated */
     2 #include <jni.h>
     3 /* Header for class cn_com_comit_jni_HelloJni */
     4  
     5 //避免重复包含头文件
     6 
     7 #ifndef _Included_cn_com_comit_jni_HelloJni 
     8 #define _Included_cn_com_comit_jni_HelloJni
     9 
    10 //c++编译环境中才会定义__cplusplus (plus就是"+"的意思
    11 
    12 #ifdef __cplusplus 
    13 extern "C" {  //告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载14 #endif
    15 /*
    16  * Class:     cn_com_comit_jni_HelloJni
    17  * Method:    displayHelloJni
    18  * Signature: ()V
    19  */
    20 JNIEXPORT void JNICALL Java_cn_com_comit_jni_HelloJni_displayHelloJni
    21   (JNIEnv *, jobject);
    22  
    23 #ifdef __cplusplus
    24 }
    25 #endif
    26 #endif

     备注:注意路径和空格的问题!

     转载学习自:https://www.cnblogs.com/charley_yang/archive/2011/03/13/1983038.html!

  • 相关阅读:
    Please check logcat output for more details
    如何移植freertos
    依赖: nginx-common (= 1.14.0-0ubuntu1) 但是它将不会被安装
    错误:22 http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu bionic Release 404 Not Found [IP: 91.189.95.83 80]
    由于没有公钥,无法验证下列签名:
    jQuery的TAB切换+定时器
    CSS问题1:div中 li宽度不固定 ie6和ie7不兼容不自动换行
    (转)Sqlite中INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
    (转)JS加载顺序
    (转)在网页中JS函数自动执行常用三种方法
  • 原文地址:https://www.cnblogs.com/zhaosq/p/11301924.html
Copyright © 2011-2022 走看看