首先要下载eclipse_java,安装ADT,CDT,NDK,
在MainActivity中写一些本地函数声明:
- public native void fun1();
- public native String fun2();
- public native char fun3();
- public native int fun4();
- public native double fun5();
- 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文件中书写的函数:
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_example_jnitest_MainActivity */
- #ifndef _Included_com_example_jnitest_MainActivity
- #define _Included_com_example_jnitest_MainActivity
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_example_jnitest_MainActivity
- * Method: fun1
- * Signature: ()V
- */
- JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_fun1
- (JNIEnv *, jobject);
- /*
- * Class: com_example_jnitest_MainActivity
- * Method: fun2
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_fun2
- (JNIEnv *, jobject);
- /*
- * Class: com_example_jnitest_MainActivity
- * Method: fun3
- * Signature: ()C
- */
- JNIEXPORT jchar JNICALL Java_com_example_jnitest_MainActivity_fun3
- (JNIEnv *, jobject);
- /*
- * Class: com_example_jnitest_MainActivity
- * Method: fun4
- * Signature: ()I
- */
- JNIEXPORT jint JNICALL Java_com_example_jnitest_MainActivity_fun4
- (JNIEnv *, jobject);
- /*
- * Class: com_example_jnitest_MainActivity
- * Method: fun5
- * Signature: ()D
- */
- JNIEXPORT jdouble JNICALL Java_com_example_jnitest_MainActivity_fun5
- (JNIEnv *, jobject);
- /*
- * Class: com_example_jnitest_MainActivity
- * Method: fun6
- * Signature: (ILjava/lang/String;)V
- */
- JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_fun6
- (JNIEnv *, jobject, jint, jstring);
- #ifdef __cplusplus
- }
- #endif
- #endif
与java原文件中相应的native函数都已经在这个头文件中声明好了,以后只要按相应的函数名书写函数,就可以在java原文件中调用。
写一个Android.mk文件,该文件说明了.c文件编译的相关信息:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := myjni
- LOCAL_SRC_FILES := main.c
- include $(BUILD_SHARED_LIBRARY)
其中指明了将main.c便以为myjni;
所以开始写一个main.c
- #include<jni.h>
- #include<string.h>
- void JNICALL Java_com_example_jnitest_MainActivity_fun1
- (JNIEnv *, jobject);
- jstring Java_com_example_jnitest_MainActivity_fun2
- (JNIEnv *e, jobject o){
- return (*e)->NewStringUTF(e, "I am a string from jni, good!");
- }
- jchar Java_com_example_jnitest_MainActivity_fun3
- (JNIEnv *, jobject);
- jint Java_com_example_jnitest_MainActivity_fun4
- (JNIEnv *, jobject);
- jdouble Java_com_example_jnitest_MainActivity_fun5
- (JNIEnv *, jobject);
- void Java_com_example_jnitest_MainActivity_fun6
- (JNIEnv *, jobject, jint, jstring);
至于语法可以参考其他资料
然后就要为项目添加C编译器来将C代码编译成so文件以便调用:
单击项目->属性:
在builders选项卡中选new,添加一个Program编译器:
编译器配置界面:
Location是NDK解压目录下的ndk-build.cmd
WorkingDirectory选择当前项目空间,保存
这时编译器列表中多了一个编译器,将其通过Up移到最高处,以使C代码能在最先编译
每次便以项目时:Console会显示:
- "Compile thumb : myjni <= main.c
- SharedLibrary : libmyjni.so
- Install : libmyjni.so => libs/armeabi/libmyjni.so
说明编译成功,项目中的lib多了.so文件:
在java代码中通过以下声明调用该链接库:
- static{
- System.loadLibrary("myjni");
- }
NDK目录下samples文件夹下提供了一些实例可供参考