android jni调用心得

jni 的调用分几种方式:
1。静态调用
2。动态调用


动态调用就是,平时说的,在项目中新建jni目标,用NDK方法来编译。最终生成so文件借当前项目需要的时候,调用 


静态调用就是开机的时候加载到虚拟机里面的方式,这里也分两种方式,
  1。同样Simplejni 路径:/rowboat-android/development/samples/SimpleJNI
    从这个例子可以看出,这种方式调用是,采用封装好的形式,加载到虚拟机里面去,然后调用的方式也区别于ndk,因为方法名前面不用加包名
  2。另外一个是把.cpp文件放在framework下面,来保证开机加载到虚拟机里面去,文件存放目录为:rowboat-android/frameworks/base/core/jni
    在这个目录下面也有类似的例子,如:

android_os_Power.cpp


static void releaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj)
{
if (idObj == NULL) {
throw_NullPointerException(env, "id is null");
return ;
}

const char *id = env->GetStringUTFChars(idObj, NULL);

release_wake_lock(id);

env->ReleaseStringUTFChars(idObj, id);

}


把定义的方法加载到方法列表当中
static JNINativeMethod method_table[] = {
{ "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
{ "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
{ "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
{ "setScreenState", "(Z)I", (void*)setScreenState },
{ "shutdown", "()V", (void*)android_os_Power_shutdown },
{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
{ "VirtualKey", "()V", (void*)android_os_Power_VirtualKey },
{ "sendKye", "()V", (void*)android_os_Power_sendKey },
};       


//注册所有方法到虚拟机
int register_android_os_Power(JNIEnv *env)
{
return AndroidRuntime::registerNativeMethods(
env, "android/os/Power",
method_table, NELEM(method_table));
}    


//AndroidRuntime.cpp
extern int register_android_os_Power(JNIEnv *env);   

REG_JNI(register_android_os_Power),


在这里增加到总的虚拟机上面,方便统一加载 
在这个文件当中完成统一的开机,虚拟机统一加载 。。。。。。


如果 是这种方式调用,那么在程序当中只要直接调用方法名就行了,不需要像NDK 那样System.loadLibrary("demo");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值