jni的调用:
1)加载动态库, static用于优先执行,
static{
// 加载jni动态库的时候会执行so中的JNI_OnLoad()
System.loadLibrary("led_jni"); // /system/lib/libled_jni.so
}
2)声明本地方法
public native int opeDev();
public native int devOn();
public native int devOff();
public native int closeDev();
3) 调用本地方法:
opeDev();
jni的编写:
1)实现一个接口:
jint JNI_OnLoad(JavaVM* vm, void* reserved)
1, 获取dvm中环境变量对象,并且测试jni的版本是否为1.4
env对象能提供各种方法,去操作java中代码: 属性和方法
vm->GetEnv(void * * env,jint version)
参数1: 环境变量对象
JNIEnv 包括了操作整个jni空间的各种方法
参数2: 需要被测试版本
返回值: 正常: 0
错误: 负数
使用:
JNIEnv *env = NULL;
jint ret = vm->GetEnv( (void **)&env, JNI_VERSION_1_4);
if(ret != 0)
{
xxx
}
2) 注册映射表
typedef struct {
const char*name; // java方法名
const char*signature; // 方法的描述
void*fnPtr; // c/c++的函数名
} JNINativeMethod;
JNINativeMethod myMethods[] = {
{"openDev", "()I", (void *)open_led},
{"devOn", "()I", (void *)led_on},
{"devOff", "()I", (void *)led_off},
{"closeDev", "()I", (void *)close_led},
};
// 获取java中native方法所在的包.类
jclass cls= env->FindClass("com/example/ledjnitest/LedActivity");
env->RegisterNatives(jclass clazz,const JNINativeMethod * methods,jint nMethods)
参数1: jclass clazz, 描述java中本地方法所在的类
env->FindClass(char *name);
==>
jclass mycls = env->FindClass("com/hq/ledjnitest/MainActivity");
参数2: 映射表对象
参数3: 映射表中的项目数