2017-08-22 632 views
-1

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

这是错误:

JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception 'java.lang.ClassNotFoundExceptio in call to NewGlobalRef from java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String)

+0

**因为你改变了包名* *,在你的Java代码中,而不是在你的JNI代码中,所以你从FindClass()中得到了一个'ClassNotFoundException',并且你没有检测到它返回了零,所以你没有调用其中一个异常处理方法,所以你有这个'异常待处理'错误。 – EJP

回答

2

JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception 'java.lang.ClassNotFoundException' in call to NewGlobalRef from java.lang.String 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"); 

但你从com.example.ndktest.SomeClass改变SomeClass包的名字com.other.package.SomeClass。不过,你可能也没改变你的搜索,你还需要更新您的FindClass(...)调用class..so:

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

希望这有助于