2017-08-22 630 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"); 

希望這有助於