JNI的两种方式

两种方式在java层的内容是一样的,在Java层加入
System.loadLibrary("logControl-jni");
一般加在
static {
        System.loadLibrary("logControl-jni");
 }
也可加在onCreate等方法中,只要在你使用native的方法之前就可以了。

HAL层第一种方式:
比较简单,适合只有几个简单JNI调用的场合,
只要在hal层加入一个动态库,native方法的名字写成
extern  "C"  jboolean Java_com_android_settings_LogControler_prepareTFDir(JNIEnv* env, jobject thiz)
对应上层com/android/settings/LogControler.java中的叫prepareTFDir的native方法,在文件头加入#include <jni.h> 就可以了。

HAL层第二种方式:
适合有较多JNI调用的场合,有多个模块中都有JNI调用,用这种方式可以有较管理各种模块的调用。
其中最主要的是一个 函数:
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
   JNIEnv* env = NULL;
   jint result = -1;

   if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
      ALOGE("GetEnv error!!");
      return result;
   }

。。。(添加别的模块的注册函数)

   return JNI_VERSION_1_4;
}
(之所以用extern "C",是因为java的dalvik是用C语言写的,而不是C++;所以你如果是把这个函数写在C++文件中,是告诉C++编译器这个函数做为C语言的格式进行编译,不用C++ 的方式编译为函数名加参数组成函数名的方式,不然dalvik调用时会发生找不到的情况。)

一般的组织形式是把JNI_OnLoad放在一个onload.cpp中,在JNI_Onload函数中调用别的模块的注册函数,如
register_com_android_settings_LogControler(env);

在register_com_android_settings_LogControler所在的文件中,
加入
static JNINativeMethod method_table[] = {
   {"clearLogs", "()Z", (void *)clearLogs},
};

static int register_com_android_settings_LogControler(JNIEnv *env) {
   return jniRegisterNativeMethods(env, "com/android/settings/LogControler",
         method_table, NELEM(method_table));
}
调用jniRegisterNativeMethods就为java层(com/android/settings/LogControler)的native函数声明clearLogs找到了对应的Hal层的函数clearLogs。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值