c java android lunix,Android java层和C层的相互调用

在Android的VM里,可以加载C模块(也就是so库),及通过System.loadLibrary()函数来加载。当加载某个so库时,VM会先执行其实现的JNI_Onload函数。该函数的原型为:exern "c" jint  JNI_Onload(JavaVM* vm, void* reserved); 注意每个线程调用这个so库时传入的vm会不同。保证线程安全的代码必须注意对此vm的判断。

于是,我们可以在JNI_Onload函数里进行一些初始化工作,可以向java层注册c层的native函数,实现java层向c层的调用。

利用传入的vm我们可以得到JNIEnv 指针,然后利用jniResiterNativMetheds函数来实现向java层注册C函数。首先定义一个结构:

static JNINativeMethod sMethods[] = {

/*name,signature,funcptr */

{"close","(I)V" ,(void*)android_close},

{....... },

};

return jniRegisterNativeMethods(env,"com/android/server/AlarmService",sMethods,NELEM(sMethods));

然后在C层实现static void android_close(JNIEnv *env, jobject obj)函数。

OK,到这就可以在java的AlarmService类里声明一个这样的函数:

private static native void close();

调用它就进入了该so模块。所有这一切都是android的java虚拟机帮我们完成的。

反之,利用java虚拟机,我们也可以完成从c层回调java层。利用的还是那个很重要的类变量JNIEnv env.

FindClass();

GetMethodID();

CallObjectMethod();

CallStaticObjectMethod();

具体的细节可以参考手册。0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值