Android中使用jni进行本地开发

首先要下载eclipse_java,安装ADT,CDT,NDK,

在MainActivity中写一些本地函数声明:

Java代码   收藏代码
  1. public native void fun1();  
  2. public native String fun2();  
  3. public native char fun3();  
  4. public native int fun4();  
  5. public native double fun5();  
  6. public native void fun6(int i, String s);  

 

配置好Java环境变量;



 

然后控制台进入项目的bin/classes,输入javah -jni命令,生成相关.h头文件;



 如果报找不到Activity类的话可以暂时去掉MainActivity中的extends Activity声明,并把与Activity相关代码注释,再次编译后运行javah -jni,就没有错了,这时生成一个.h头文件,com_example_jnitest_MainActivity.h

在工程中创建jni目录,把头文件移动到里面,头文件里包含了以后要在.c文件中书写的函数:

C代码   收藏代码
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_example_jnitest_MainActivity */  
  4.   
  5. #ifndef _Included_com_example_jnitest_MainActivity  
  6. #define _Included_com_example_jnitest_MainActivity  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     com_example_jnitest_MainActivity 
  12.  * Method:    fun1 
  13.  * Signature: ()V 
  14.  */  
  15. JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_fun1  
  16.   (JNIEnv *, jobject);  
  17.   
  18. /* 
  19.  * Class:     com_example_jnitest_MainActivity 
  20.  * Method:    fun2 
  21.  * Signature: ()Ljava/lang/String; 
  22.  */  
  23. JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_fun2  
  24.   (JNIEnv *, jobject);  
  25.   
  26. /* 
  27.  * Class:     com_example_jnitest_MainActivity 
  28.  * Method:    fun3 
  29.  * Signature: ()C 
  30.  */  
  31. JNIEXPORT jchar JNICALL Java_com_example_jnitest_MainActivity_fun3  
  32.   (JNIEnv *, jobject);  
  33.   
  34. /* 
  35.  * Class:     com_example_jnitest_MainActivity 
  36.  * Method:    fun4 
  37.  * Signature: ()I 
  38.  */  
  39. JNIEXPORT jint JNICALL Java_com_example_jnitest_MainActivity_fun4  
  40.   (JNIEnv *, jobject);  
  41.   
  42. /* 
  43.  * Class:     com_example_jnitest_MainActivity 
  44.  * Method:    fun5 
  45.  * Signature: ()D 
  46.  */  
  47. JNIEXPORT jdouble JNICALL Java_com_example_jnitest_MainActivity_fun5  
  48.   (JNIEnv *, jobject);  
  49.   
  50. /* 
  51.  * Class:     com_example_jnitest_MainActivity 
  52.  * Method:    fun6 
  53.  * Signature: (ILjava/lang/String;)V 
  54.  */  
  55. JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_fun6  
  56.   (JNIEnv *, jobject, jint, jstring);  
  57.   
  58. #ifdef __cplusplus  
  59. }  
  60. #endif  
  61. #endif  

 

与java原文件中相应的native函数都已经在这个头文件中声明好了,以后只要按相应的函数名书写函数,就可以在java原文件中调用。

写一个Android.mk文件,该文件说明了.c文件编译的相关信息:



 

Android.mk代码   收藏代码
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE    := myjni  
  6. LOCAL_SRC_FILES := main.c  
  7.   
  8. include $(BUILD_SHARED_LIBRARY)  

 其中指明了将main.c便以为myjni;

所以开始写一个main.c

 

C代码   收藏代码
  1. #include<jni.h>  
  2. #include<string.h>  
  3.   
  4. void JNICALL Java_com_example_jnitest_MainActivity_fun1  
  5.   (JNIEnv *, jobject);  
  6.   
  7. jstring Java_com_example_jnitest_MainActivity_fun2  
  8.   (JNIEnv *e, jobject o){  
  9.     return (*e)->NewStringUTF(e, "I am a string from jni, good!");  
  10. }  
  11.   
  12. jchar Java_com_example_jnitest_MainActivity_fun3  
  13.   (JNIEnv *, jobject);  
  14.   
  15. jint Java_com_example_jnitest_MainActivity_fun4  
  16.   (JNIEnv *, jobject);  
  17.   
  18. jdouble Java_com_example_jnitest_MainActivity_fun5  
  19.   (JNIEnv *, jobject);  
  20.   
  21. void Java_com_example_jnitest_MainActivity_fun6  
  22.   (JNIEnv *, jobject, jint, jstring);  

 

至于语法可以参考其他资料

然后就要为项目添加C编译器来将C代码编译成so文件以便调用:

单击项目->属性:



 

 在builders选项卡中选new,添加一个Program编译器:



 编译器配置界面:



 Location是NDK解压目录下的ndk-build.cmd

WorkingDirectory选择当前项目空间,保存



 

这时编译器列表中多了一个编译器,将其通过Up移到最高处,以使C代码能在最先编译

每次便以项目时:Console会显示:

Console代码   收藏代码
  1. "Compile thumb : myjni <= main.c  
  2.   
  3. SharedLibrary  : libmyjni.so  
  4.   
  5. Install        : libmyjni.so => libs/armeabi/libmyjni.so  

 

说明编译成功,项目中的lib多了.so文件:



 在java代码中通过以下声明调用该链接库:

Java代码   收藏代码
  1. static{  
  2.         System.loadLibrary("myjni");  
  3.     }  

NDK目录下samples文件夹下提供了一些实例可供参考

原文链接http://hzy3774.iteye.com/blog/1706373

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值