Java 运行时从jar文件加载的类上的FindClass
在这个问题上工作了几天之后,我现在正用头撞我的桌子 我的原生android应用程序在运行时加载了一个类,我按照这个方法从assets文件夹中获取了dexed jar,并成功地加载了该类并调用了它的静态方法 但是如果我运行一个Java 运行时从jar文件加载的类上的FindClass,java,android,c++,java-native-interface,Java,Android,C++,Java Native Interface,在这个问题上工作了几天之后,我现在正用头撞我的桌子 我的原生android应用程序在运行时加载了一个类,我按照这个方法从assets文件夹中获取了dexed jar,并成功地加载了该类并调用了它的静态方法 但是如果我运行一个 env->FindClass("TheClass"); 。。。它抛出一个java异常 下面是代码的相关位 //this works find and gives me a usable class jclass shim_class = helper.LoadCl
env->FindClass("TheClass");
。。。它抛出一个java异常
下面是代码的相关位
//this works find and gives me a usable class
jclass shim_class = helper.LoadClassFromAssetsJar("test.jar","TheClass");
// this throws the exception
jclass refound_shim_class = jni->FindClass("TheClass");
任何帮助都是难以置信的,干杯,伙计们,这里有很多东西 首先,正如@alexcohn所说的,我们需要保留这个类,这个类很容易使用,它将使jobject(或jclass等)在发布之前不会被重新分配。我认为这种效果是线程本地的,因为这是一些早期版本的android(据我所知)中的效果 接下来,出于不让您感到厌烦的原因,我们正在使用,因为我们正在从assets文件夹加载apk,所以我们还需要保留此文件。FindClass只能在它自己的上下文中工作,该上下文用于加载系统类 现在,我们需要能够在每个线程中使用来自apk的类,因此,当我们为每个线程创建JniEnv时,我们运行declassloader.loadclass,并使用缓存缓存它。通过这种方式,我们可以在任何地方获得类,并通过keythread回调自动进行释放 不管怎样,这已经够了。祝你好运
p、 顺便说一句,一旦jni方法抛出了一个未经处理的异常,您就不能保证任何其他调用都会工作……有些会,有些不会,有些会导致segfault……所以从java端自由捕获,并保护本机端不受java的影响 这与类加载器有关-您可能需要在
JNI_OnLoad
中执行所有FindClass
调用,或者在调用FindClass
时使用正确的类加载器。有关如何在Android上工作的示例,请参阅。我会说:如果你已经从你的加载器中获得了类,那么就保留它以备将来使用!