JNI getmethodID仅在ICS中返回NULL,但在Gingerbread中不返回NULL

时间:2012-03-21 06:26:49

标签: android java-native-interface android-4.0-ice-cream-sandwich

我目前正在将姜饼代码移植到ICS。 C和Java之间的通信在Gingerbread中正确发生。但同样的事情在ICS中崩溃了。无法搞清楚。

ICS jni的主要变化是什么?

我目前的问题,

1.获取类实例并将其转换为全局引用并存储它。

  jclass myWrapperClass = (*env)->FindClass(env,"com/test/mypackage/Wrapper");

  if (voipWrapperClass == NULL) {

   // error - handling and returns

  }

  WrapperClass = (jclass)(*env)->NewGlobalRef(env,myWrapperClass);

2.从JNI调用开始,流程转到堆栈下方,并将回调返回给jni。从JNI到java下面的函数调用

  void response(void* ptr, int result){

  JNIEnv *envPtr= NULL;

  JavaVM* vmPtr= p_pdb->vm;

  if ((*vmPtr)->GetEnv(vmPtr,(void**) &envPtr, JNI_VERSION_1_4) == JNI_EDETACHED) {

      (*vmPtr)->AttachCurrentThread(vmPtr,(void**)&envPtr,NULL);

  }

  if (ptr->WrapperClass == NULL) {

      // error- handling and return   
  }

  RespMethodId = (*envPtr)->GetMethodID(envPtr,ptr->WrapperClass, "resp","(Z)V");

  // this method is always 0 ... prev for gingerbread it returned a valid id..

  }

请给我一个解决方法如何继续进行。?

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。我曾经在android代码库(2.3.3)中编译我的代码但是如果你需要构建一个单独的共享库则使用NDK并构建一个单独的库。否则将代码放在frameworks文件夹中。这解决了这个问题。 :)