在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);
显然错过jint
和myMethod_methodID
之间的myfirst_jstring
参数。
我花了很长时间来跟踪这些错误,因为logcat中没有相关的输出,唯一的行为是没有做任何事情(它甚至没有崩溃)。
所以,问题是:如何针对这类错误获得更有意义的错误?
答案 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