【问题标题】:Why jni not loading after changing package name为什么更改包名后jni不加载
【发布时间】:2017-08-22 07:44:11
【问题描述】:

大家好,我需要帮助。问题是我的jni 在更改包名称后没有加载。在它工作之前非常酷。我试图解决它,但我不能。所以请帮助我。

这是错误:

在应用程序中检测到 JNI 错误:调用 JNI NewGlobalRef 时出现未决异常“java.lang.ClassNotFoundExceptio” 致电 NewGlobalRef 来自 java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String)

【问题讨论】:

  • 因为你更改了包名,在你的 Java 代码而不是你的 JNI 代码中,所以你从FindClass() 得到了一个ClassNotFoundException,你没有检测到它返回零,所以你没有调用异常处理方法之一,所以你得到了这个“异常挂起”错误。

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


【解决方案1】:

在应用程序中检测到 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)。

在您的情况下,您的应用程序崩溃了,因为在引发未决异常之后调用NewGlobalRefNewGlobalRef 不在异常后可以安全调用的方法列表中。但是,您也看到了未决异常的原因: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");

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多