Android JNI:早期代码中的本机代码可以找到Java类的可能原因变成以后无法找到?

时间:2014-01-02 10:30:44

标签: android java-native-interface

我是Android开发的新手,尤其是使用JNI进行开发。

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

问题是:在运行项目时,本机代码找不到Java类ClassJavaA,但是当我在前面执行的某些代码中放置代码来查找该类时,可以找到该类。

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

欢迎任何线索,谢谢。

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

1 个答案:

答案 0 :(得分: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