我是Android开发的新手,尤其是使用JNI进行开发。
不幸的是(或幸运的是?)我正在开发一个几乎已经完成的项目。它的大部分逻辑是用本机c ++代码编写的。
问题是:在运行项目时,本机代码找不到Java类ClassJavaA,但是当我在前面执行的某些代码中放置代码来查找该类时,可以找到该类。
由于调试粗糙的本机c ++代码非常困难,我想知道是否有一些典型的可能原因导致这种现象。
欢迎任何线索,谢谢。
PS: 线程附着不是问题,我已经检查过了。
答案 0 :(得分:1)
听起来像这个问题:
FAQ: Why didn't FindClass find my class?
如果类名看起来正确,则可能会遇到类加载器问题。
推荐的解决方法是:
- 在JNI_OnLoad中执行一次FindClass查找,并缓存类引用以供以后使用。作为执行JNI_OnLoad的一部分而进行的任何FindClass调用都将使用与调用System.loadLibrary的函数关联的类加载器(这是一个特殊规则,用于使库初始化更方便)。如果您的应用程序代码正在加载库,则FindClass将使用正确的类加载器。
- 通过声明本机方法获取Class参数然后传入Foo.class,将类的实例传递给需要它的函数。
- 在某个地方缓存对ClassLoader对象的引用,并直接发出loadClass调用。这需要一些努力。
这里有最后一个例子: