JNI概念
JNI是本地语言编程接口。它允许运行在JVM中的Java代码和用C、C++或汇编写的本地代码相互操作。
在以下几种情况下需要使用到JNI:
l 应用程序依赖于特定平台,平台独立的Java类库代码不能满足需要
l 你已经有一个其它语言写的一个库,并且这个库需要通过JNI来访问Java代码
l 需要执行速度要求的代码实现功能,比如低级的汇编代码
通过JNI编程,你可以使用本地方法来:
l 创建、访问、更新Java对象
l 调用Java方法
l 捕获及抛出异常
l 加载并获得类信息
l 执行运行时类型检查
- JNI_OnLoad为入口函数,代码基本可参照以下模板
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
{
RLOGE("GetEnv failed!");
return result;
}
register_led_hal_jni(env);
return JNI_VERSION_1_4;
}
调用了register_led_hal_jni
- 实现register_led_hal_jni
在"com/led/LedHalService"下寻找class类
clazz = env->FindClass(kClassName);
找到该类后注册
env->RegisterNatives(clazz, methods,sizeof(methods) / sizeof(methods[0]))
- 实现led_setOn,led_setOff函数
使用led_hal_device的接口来实现
led_hal_device->set_off
led_hal_device->set_on
- 实现led_init 函数
通过ID号找到mudule
**hw_get_module(LED_HARDWARE_MODULE_ID, (const hw_module_t**) &module)**
通过module->methods->open函数初始化led_hal_device
**led_control_open(&module->hw_module, &led_hal_device)**
- 建立Java方法与本地方法的映射
static const JNINativeMethod methods[] =
{
{ "_init", "()Z", (void *) led_init },
{ "_set_on", "(I)Z", (void *) led_setOn },
{ "_set_off", "(I)Z", (void *) led_setOff }, };