Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行时从jar文件加载的类上的FindClass_Java_Android_C++_Java Native Interface - Fatal编程技术网

Java 运行时从jar文件加载的类上的FindClass

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

在这个问题上工作了几天之后,我现在正用头撞我的桌子

我的原生android应用程序在运行时加载了一个类,我按照这个方法从assets文件夹中获取了dexed jar,并成功地加载了该类并调用了它的静态方法

但是如果我运行一个

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上工作的示例,请参阅。我会说:如果你已经从你的加载器中获得了类,那么就保留它以备将来使用!