方法签名和实际调用之间不匹配

时间:2011-04-21 11:40:54

标签: android java-native-interface

在android上使用java原生界面时,我犯了两个愚蠢的错误,花了我很多时间。

有这个方法id:

jmethodID myMethod_methodID = env->GetMethodID(hello_Cls, "myMethod", "(ILjava/lang/String;Ljava/lang/String;I)Z");

我的第一个错误是使用

调用它
env->CallVoidMethod

我的第二个错误就是这样称呼它

jboolean rv = jenv->CallBooleanMethod(hello_obj, myMethod_methodID, myfirst_jstring, mysecond_jstring, 1);

显然错过jintmyMethod_methodID之间的myfirst_jstring参数。

我花了很长时间来跟踪这些错误,因为logcat中没有相关的输出,唯一的行为是没有做任何事情(它甚至没有崩溃)。

所以,问题是:如何针对这类错误获得更有意义的错误?

1 个答案:

答案 0 :(得分:4)

此页面可能有用:http://www.netmite.com/android/mydroid/dalvik/docs/jni-tips.html,特别是:

  

JNI进行的错误检查非常少。在Object字段上调用SetFieldInt将成功。我们的目标是尽量减少开销,假设如果你用本机代码编写它,你可能是出于性能原因而做的。

     

某些VM支持使用“-Xcheck:jni”标志进行扩展检查。如果设置了该标志,则VM将不同的函数表放入JavaVM和JNIEnv指针中。在调用标准实现之前,这些函数会执行一系列扩展检查。

     

可以验证的一些事情:

     
      
  • 检查不允许的空指针。
  •   
  • 验证参数类型的正确性(jclass是一个类对象,jfieldID指向字段数据,jstring是java.lang.String)。
  •   
  • 字段类型正确性,例如不要在字符串字段中存储HashMap。
  •   
  • 检查待处理异常不合法的呼叫是否有待处理的异常。
  •   
  • 检查重要获取/释放呼叫之间是否存在对不当功能的呼叫。
  •   
  • 检查线程之间是否没有共享JNIEnv结构。
  •   
  • 确保在允许的使用期限之外不使用本地引用。
  •   
  • UTF-8字符串包含有效的“修改过的UTF-8”数据。
  •   
     

不检查方法和字段(即公共与私有)的可访问性。

点击链接:http://www.netmite.com/android/mydroid/dalvik/docs/embedded-vm-control.html

您可以按如下方式设置adb:

adb shell setprop dalvik.vm.checkjni true
adb shell setprop dalvik.vm.execution-mode int:debug