更改包名后为什么不加载jni

时间:2017-08-22 07:44:12

标签: java android android-ndk java-native-interface

嘿伙计我需要一些帮助。问题是更改包名后我的jni未加载。在它工作之前很酷。我试图解决它但我无法解决。所以请帮助我。

这是错误:

  

应用程序中的JNI检测错误:JNI NewGlobalRef调用挂起异常' java.lang.ClassNotFoundExceptio       在致NewGlobalRef       来自java.lang.String java.lang.Runtime.nativeLoad(java.lang.String,java.lang.ClassLoader,java.lang.String)

1 个答案:

答案 0 :(得分:2)

  

应用程序中的JNI检测错误:JNI NewGlobalRef调用了   调用挂起异常'java.lang.ClassNotFoundException'   来自java.lang.String的NewGlobalRef   java.lang.Runtime.nativeLoad(java.lang.String,java.lang.ClassLoader,   java.lang.String中)

当您调用NewGlobalRef时,您有一个挂起的异常。执行JNI代码时发生异常时,您的应用程序不会崩溃,但会创建“挂起的异常”。在执行可能引发异常的JNI工作时,您有责任检查异常。

创建挂起的异常后,只有少数几种JNI方法可以安全地调用(提到here)。

在您的情况下,您的应用程序崩溃是因为在抛出挂起的异常后调用NewGlobalRef之前。 NewGlobalRef不在异常后可安全调用的方法列表中。但是,您还会看到待处理异常的原因:java.lang.ClassNotFoundException

很有可能发生这种情况是因为你试图做类似的事情:

cls = (*env)->FindClass(env, "com/example/ndktest/SomeClass");

但随后您将SomeClass的包名称从com.example.ndktest.SomeClass更改为com.other.package.SomeClass。但是,您可能也没有更改搜索课程的方式。因此您还需要将FindClass(...)来电更新为:

cls = (*env)->FindClass(env, "com/other/package/SomeClass");

希望这有帮助