JNI概念
JNI是本地語(yǔ)言編程接口棱诱。它允許運(yùn)行在JVM中的Java代碼和用C栓霜、C++或匯編寫的本地代碼相互操作粉怕。
在以下幾種情況下需要使用到JNI:
l 應(yīng)用程序依賴于特定平臺(tái)处坪,平臺(tái)獨(dú)立的Java類庫(kù)代碼不能滿足需要
l 你已經(jīng)有一個(gè)其它語(yǔ)言寫的一個(gè)庫(kù)锅必,并且這個(gè)庫(kù)需要通過JNI來訪問Java代碼
l 需要執(zhí)行速度要求的代碼實(shí)現(xiàn)功能,比如低級(jí)的匯編代碼
通過JNI編程氢卡,你可以使用本地方法來:
l 創(chuàng)建锈至、訪問、更新Java對(duì)象
l 調(diào)用Java方法
l 捕獲及拋出異常
l 加載并獲得類信息
l 執(zhí)行運(yùn)行時(shí)類型檢查
- JNI_OnLoad為入口函數(shù)译秦,代碼基本可參照以下模板
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;
}
調(diào)用了register_led_hal_jni
- 實(shí)現(xiàn)register_led_hal_jni
在"com/led/LedHalService"下尋找class類
clazz = env->FindClass(kClassName);
找到該類后注冊(cè)
env->RegisterNatives(clazz, methods,sizeof(methods) / sizeof(methods[0]))
- 實(shí)現(xiàn)led_setOn峡捡,led_setOff函數(shù)
使用led_hal_device的接口來實(shí)現(xiàn)
led_hal_device->set_off
led_hal_device->set_on
- 實(shí)現(xiàn)led_init 函數(shù)
通過ID號(hào)找到mudule
**hw_get_module(LED_HARDWARE_MODULE_ID, (const hw_module_t**) &module)**
通過module->methods->open函數(shù)初始化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 }, };