首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

怎么在native代码里面回调java中的方法

2013-07-09 
如何在native代码里面回调java中的方法? ? ? ? ? ? 现在的Android应用,越来越多开始使用JNI调用了,把底层

如何在native代码里面回调java中的方法

? ? ? ? ? ? 现在的Android应用,越来越多开始使用JNI调用了,把底层的复杂运算交给C/C++来完成,然后通过JNI来完成java与C/C++的连接。

? ? ? ? ? ? 在我开发一个这样的应用的过程中,遇到了一个回调的问题。除了在java层调用C的实现,有时候也需要在C层调用java的方法。比如,在C层实现的事件处理器需要在事件发生时,上抛事件,告诉java层。

? ? ? ? ? ? 这个过程和java调用C不一样,java中的调用是声明了native关键字的方法,在C层去实现他的方式来调用,他可以获得JNI interface 的指针(就是JNIEnv),可以获得虚拟机的上下文环境。而C中调用java中的方法是没有办法获得这些东西,必须通过java虚拟机来获得。Java提供了满足这种需求的API(Invocation API:http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html)。

?

?

? ? ? ? ? ? ?Invocation API允许应用区加载Java虚拟机到任意一个native应用,比如:

? ? ? ? ? ? ?

//declare java VM and jobjectJavaVM* globalVM;jobject globalObj;//Get VM and JNIEnv at a native implemention method statementJNIEXPORT jint JNICALL Java_com_ericsson_mstv_client_upnp_api_UPnPCtrlPointNative_ctrlPointStart(JNIEnv *env, jobject jObj) {globalObj = (*env)->NewGlobalRef(env, jObj);(*env)->GetJavaVM(env, &globalVM);return startCtrlPoint(uPnPCallback,NULL);}//event handlervoid callback(....){    JNIEnv *env;    if(!globalVM || !globalObj){           return;     }     int envState = (*globalVM)->GetEnv(globalVM, (void **) &env, JNI_VERSION_1_6);     if (envState == JNI_EDETACHED) {envState = (*globalVM)->AttachCurrentThread(globalVM, &env, NULL);if (envState != 0) {//something log printreturn;}} else if (envState == JNI_EVERSION) {//something log printreturn;}        //JNI data structure conversion       ........       (*globalVM)->DetachCurrentThread(globalVM);}JNIEXPORT jint JNICALL Java_com_ericsson_mstv_client_upnp_api_UPnPCtrlPointNative_ctrlPointStop(JNIEnv *env, jobject jObj) {(*env)->DeleteGlobalRef(env, globalObj);globalVM = NULL;return stopCtrlPoint();}

?

?

? ?在这里用到了两个native方法,因为在在我们项目中的lifecycle的start和stop阶段调用,所以就把VM的一些逻辑放到里面来完成。其实Invocation API中提供了两个方法:jint JNI_OnLoad(JavaVM *vm, void *reserved) 和void JNI_OnUnload(JavaVM *vm, void *reserved),他们分别在程序的开始和结束的时候调用。我们可以把一些初始化和释放的工作在这两个方法中完成。

?

? ?是不是很有意思?

? ? ? ??

?

热点排行