1、 配置NDK开发环境,具体过程参考:
http://blog.youkuaiyun.com/pengchua/article/details/7582949
2、 用eclipse创建一个android项目,例如NDKTest1,包名为:com.example.ndktest1
3、 创建JNI调用接口,在NDKTest1项目下创建文件TestJni.java,文件内容如下:
package com.example.ndktest1;
public class TestJni {
public native int add(int a,int b);
}
4、 编译这个文件并生成相应的.h文件,在dos界面中执行以下命令:
cd /d D:\dp\eclipse\NDKTest1\src
javac -d ../bin com/example/ndktest1/TestJni.java
cd ../bin
javah com.example.ndktest1.TestJni
5、 在项目目录下新建目录jni,将生成的文件com_example_ndktest1_TestJni.h拷贝进去
6、 在jni目录下新建文件jniTest.c,在文件中实现接口add,文件内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include "com_example_ndktest1_TestJni.h"
JNIEXPORT jint JNICALL Java_com_example_ndktest1_TestJni_add
(JNIEnv *env, jobject this, jint a, jint b){
void *pHandle;
int (*pFunt)(int,int);
jintresult=0;
pHandle=dlopen("/data/data/com.example.ndktest1/lib/libadd.so",RTLD_LAZY|RTLD_GLOBAL);
pFunt=(int (*)(int,int))dlsym(pHandle,"add");
result=(jint)pFunt(a,b);
dlclose(pHandle);
return result;
}
注意红色标注的地方,那是应用程序打包后被安装到手机上时在手机上.so文件存放的路径。
7、 在jni目录下添加文件Android.mk,文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test-jni
LOCAL_SRC_FILES := jniTest.c
include $(BUILD_SHARED_LIBRARY)
这个文件可以从ndk目录下的sample目录中找一个例子将其中的android.mk文件拷过来进行修改
8、 打开cygdrive,执行以下命令:
cd/cygdrive/d/dp/eclipse/NDKTest1
$NDK/ndk-build
9、 将第三方动态库libadd.so拷贝到项目下的目录libs/armeabi,这个目录在上个步骤会产生
10、 在TestJni.java文件中或者其他java文件中添加如下代码:
static {
System.loadLibrary("test-jni");
}
11、 现在就可以在java类中使用add函数了,例如:
TextView ddd=(TextView) findViewById(R.id.ddd);
TestJni tj=new TestJni();
int rlt=tj.add(12, 23);
ddd.setText("hello:"+rlt);
12、 这里用libadd.so来模拟第三方动态库,这个动态库的源文件内容如下:
#include <stdio.h>
int add(int a,int b){
return a+b;
}