public class TestJni{
static{
System.loadLibrary("xxx"); //加载 libxxx.so 库文件
}
public native void hello(); //本地方法,在so文件里实现
public static void main (String [] args){
TestJni d = new TestJni();
d.hello(); //调用库文件里面的hello方法
}
}
javac TestJni.java
生成 TestJni.classjavah TestJni
生成 TestJni.h#include
JNIEXPORT void JNICALL Java_TestJni_hello(JNIEnv * env, jobject obj){
printf("hello world\n");
}
gcc -shared -fPIC xxx.c -o libxxx.so -I /usr/lib/jvm/java-7-openjdk-amd64/include/
* -I 指定头文件的路径 -L 指定库的路径 -l更上名字 -lm -lsqlite3
sudo apt-get install openjdk+版本
)注意 android 和jdk的版本有对应关系(android 官网) vi /usr/lib/jvm/java-7-openjdk-amd64/include/linux/jni.h
1. 完成入口函数
1944 JNIEXPORT jint JNICALL
1945 JNI_OnLoad(JavaVM *vm, void *reserved);
2. 在入口函数里面实现 一下三步
2.1 获得java虚拟机环境
jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version);
2.2 找到先关的类
jclass (JNICALL *FindClass)
226 (JNIEnv *env, const char *name);
* (*env)->FindClass(env, "java/lang/String")
2.3 注册
720 jint (JNICALL *RegisterNatives)
721 (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,jint nMethods);
完成 JNINativeMethod 这个结构体 作用是本地方法和本地函数的映射关系
180 typedef struct {
181 char *name; //本地方法的名字
182 char *signature; // 本地方法的签名
183 void *fnPtr; // 相对应的本地函数
184 } JNINativeMethod;
第二种有入口函数 可以对jni 做一些初始化工作
第二种方式是通过 jninativemethod 这个结构体来匹配的
第一种是靠名字匹配的
1 实现JNI_OnLoad 函数
2 是在入口函数里面获得jvm 环境变量 通过 GetEnv 这个函数
3 找类 findclass();
4 注册 RegisterNatives method 这个结构体
5 实现 method 这个结构体 让java的本地方法 和 jni的本地函数绑定在一起
public class TestJni{
static {
System.loadLibrary("native");
}
public native int hello(int i,char j);
public static void main (String [] args){
TestJni d = new TestJni();
d.hello(12,'r');
}
}
#include
jint Jhello(JNIEnv *env,jobject obj,jint i,jchar j){
printf("%d\t%c\n",i,j);
}
//函数数组 ,
//参数1 java 里写的本地方法名
//参数2 签名(看下面的图)头文件里自动生成
//参数3 调用的函数的指针
JNINativeMethod method[] = {
"hello","(IC)I",(void *)Jhello,
};
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved)
{
JNIEnv *env;
jclass cls;
if((*vm) -> GetEnv(vm,(void **)&env,JNI_VERSION_1_4))
return JNI_ERR;
cls = (*env) ->FindClass(env,"TestJni");
if(cls == NULL) return JNI_ERR;
//注册函数
(*env) -> RegisterNatives(env,cls,method,sizeof(method)/sizeof(JNINativeMethod));
return JNI_VERSION_1_4;
}
public class TestJni{
static {
System.loadLibrary("native");
}
public native int hello(int []arr,int len);
public static void main (String [] args){
int []ibo = {12,13,14,15};
TestJni d = new TestJni();
System.out.println(d.hello(ibo,ibo.length));
}
}
“`