android NDK学习篇5之hello-jni——jni中头文件的自动生成

在NDK自带的samples项目中,jni目录下都没有.c/cpp的头文件,而是直接遵循方法命名规则。如hello-jni.c文件,

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. jstring  
  2. Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,  
  3.                                                   jobject thiz )  


直接是Java_java本地方法所在包名(用下划线_取代点.连起来)_方法名(两个固定参数,java传入的其他参数);

其中JNIEnv *env :

就是JNI运行环境,通过它才能与java层交互。JNIEnv指针是JVM创建的,用于Native的c/c++方法操纵Java执行栈中的数据,比如Java Class, Java Method等。

jobject thiz或者jclass class:

就是指当前操作的数据来源的对象,当是静态方法时,则指这个类。

具体参考这个:

http://blog.csdn.net/wantianpei/article/details/7638328

回到主题上来,上面只是表明没有.h文件,只要按照jni命名规则,java调用C方法也是没有问题的。在hello-jni工程中要生产jni头文件,需要用到javah这个工具。先看看它的帮助说明:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">用法:javah [选项] <类>  
  2.   
  3. 其中 [选项] 包括:  
  4.   
  5.     -help                 输出此帮助消息并退出  
  6.     -classpath <路径>     用于装入类的路径  
  7.     -bootclasspath <路径> 用于装入引导类的路径  
  8.     -d <目录>             输出目录  
  9.     -o <文件>             输出文件(只能使用 -d 或 -o 中的一个)  
  10.     -jni                  生成 JNI样式的头文件(默认)  
  11.     -version              输出版本信息  
  12.     -verbose              启用详细输出  
  13.     -force            始终写入输出文件  
  14.   
  15. 使用全限定名称指定 <类>(例  
  16. 如,java.lang.Object)。</span>  


一般用法是转到android项目bin/classes目录下,然后执行:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. javah -classpath ./ -d ../../jni -jni  com.example.hellojni.HelloJni  

个人习惯直接用:

在项目根目录下,直接执行:

javah -classpath ./bin/classes -d ./jni -jni com.example.hellojni.HelloJni这种风格。

执行后会在项目目录下生产jni文件夹,里面存放着自动生产的.h文件com_example_hellojni_HelloJni.h;

内容如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">/* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_example_hellojni_HelloJni */  
  4.   
  5. #ifndef _Included_com_example_hellojni_HelloJni  
  6. #define _Included_com_example_hellojni_HelloJni  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     com_example_hellojni_HelloJni 
  12.  * Method:    stringFromJNI 
  13.  * Signature: ()Ljava/lang/String; 
  14.  */  
  15. JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI  
  16.   (JNIEnv *, jobject);  
  17.   
  18. /* 
  19.  * Class:     com_example_hellojni_HelloJni 
  20.  * Method:    unimplementedStringFromJNI 
  21.  * Signature: ()Ljava/lang/String; 
  22.  */  
  23. JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI  
  24.   (JNIEnv *, jobject);  
  25.   
  26. #ifdef __cplusplus  
  27. }  
  28. #endif  
  29. #endif</span>  
include此头文件,然后编写C实现代码。

参考资料:

http://book.51cto.com/art/201305/395882.htm



转自:http://blog.csdn.net/Sunnyfans/article/details/16916451


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值