【问题标题】:Android JNI: Possible reasons a Java class can be found by native code in earlier code turns into not able to be found later?Android JNI:早期代码中的原生代码可以找到Java类变成以后找不到的可能原因?
【发布时间】:2014-01-02 10:30:44
【问题描述】:

我是 android 开发新手,尤其是使用 JNI 开发。

不幸的是(或者幸运的是?)我正在做一个几乎已经完成的项目。它的大部分逻辑都是用原生 c++ 代码编写的。

问题是:在运行项目的时候,native code找不到Java类ClassJavaA,但是当我在之前执行的一些代码中放代码找到这个类时,可以找到这个类。

由于调试笨重的原生 c++ 代码非常困难,我想知道是否有一些典型的可能原因导致了这种现象。

欢迎提供任何线索,谢谢。

PS: 线程附加不是问题,我已经检查过。

【问题讨论】:

    标签: android java-native-interface


    【解决方案1】:

    这听起来像这个问题:

    FAQ: Why didn't FindClass find my class?

    如果类名看起来正确,您可能遇到了类加载器问题。

    推荐的解决方法是:

    • 在 JNI_OnLoad 中进行一次 FindClass 查找,并缓存类引用以供以后使用。作为执行 JNI_OnLoad 的一部分进行的任何 FindClass 调用都将使用与调用 System.loadLibrary 的函数关联的类加载器(这是一个特殊规则,提供用于使库初始化更方便)。如果您的应用代码正在加载库,FindClass 将使用正确的类加载器。
    • 将类的实例传递给需要它的函数,方法是声明您的本机方法接受 Class 参数,然后传入 Foo.class。
    • 在方便的地方缓存对 ClassLoader 对象的引用,并直接发出 loadClass 调用。这需要一些努力。

    这里有最后一个的例子:

    FindClass from any thread in Android JNI

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-23
      • 2011-05-29
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多