java - 在运行时从 jar 文件加载的类上查找类

标签 java android c++ java-native-interface

在处理这个问题几天后,我目前正在用头撞我的办公 table 。

我的本​​机 android 应用程序在运行时加载一个类,我已经关注了这个作品 this tutorial从 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"); 

任何帮助都是不可思议的,伙计们,干杯

最佳答案

好吧,这里有各种各样的东西。

首先,正如@Alex Cohn 所说,我们需要保留使用 'global references' 轻松完成的类(class)。这将使一个 jobject(或 jclass 等)在被释放之前不会被重新分配。我认为这种效果是线程本地的,因为这是某些早期版本的 android 中的效果(据我所知)

接下来,出于我不会在这里让您厌烦的原因,我们正在使用 DexClassloader因为我们正在从 Assets 文件夹中加载我们的 apk (see here for how that works)所以我们也需要掌握这一点。 FindClass 只能在它自己的上下文中工作,用于加载系统类 (though you can load your own if you do this) .

现在我们需要能够在每个线程中使用 apk 中的类,因此我们在为每个线程创建 JniEnv 时运行 declassloader.loadclass,并使用 pthread_key 对其进行缓存。 .这样我们就可以在任何地方获取类,并通过键线程回调自动进行释放。

总之这就够了。祝你好运!

附注旁注,一旦 jni 方法抛出未处理的异常,您就无法保证任何其他调用都可以正常工作……有些会,有些不会,有些会导致段错误……所以从 Java 端自由地捕获并保护 native 端免受 Java 恶意攻击!

关于java - 在运行时从 jar 文件加载的类上查找类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19026654/

相关文章:

java - 如何使用 XFire 创建文档化的 WSDL

android - 初始化 fragment ,但不立即显示

java - 我应该扩展哪个类,AcionBar 还是 ActionBarImpl?

android - 如何在 AppBarLayout 上使 Logo 居中

c++ - 为什么 `std::unordered_map` "speak like the Yoda"- 重新排列元素?

java - 在中风android上设置渐变

java - 将项目添加到另一个线程中的列表时进行 CheckForCommodification

java - Apache Pig : unable to run my own pig. jar 和 pig-withouthadoop.jar

C++ 命名空间 : cross-usage

c++ - fscanf() 输出错误值