【问题标题】:Using native library in external classes loaded dynamically (with reflection)在动态加载的外部类中使用本机库(带反射)
【发布时间】:2019-01-25 16:08:39
【问题描述】:

在我的应用程序中,我使用DexClassLoader 来加载一个外部 apk 的类,如下所示:

DexClassLoader dexClassLoader = new DexClassLoader("path/to/someApkfile.apk", myOptimizedDirectory, null, myContext.getClassLoader());
Class<?> MyClass =  dexClassLoader.loadClass("its.package.name.MyClass");

然后使用反射调用方法如下:

Object myInstance = MyClass.newInstance();
MyClass.getDeclaredMethod("foo").invoke(myInstance);

这里是foo的方法:

public void foo() {
 System.Load("path/to/arch/specific/native/lib/libname.so");
 // I know that this native library loaded successfully because JNI_OnLoad is called.

 // here is the problem
 int result = myNativeMethod("arg");
}

这里是myNativeMethod

private native int myNativeMethod(String arg);

这是日志消息:

mMessages: uncaught exception
    java.lang.UnsatisfiedLinkError: No implementation found for int its.package.name.MyClass.myNativeMethod(java.lang.String) (tried Java_its_package_name_MyClass_myNativeMethod) ...

我确信我的本机代码中的方法签名是正确的,并且没有任何问题。

另外,我确定它已经成功加载了原生库,为什么会显示No implementation found

任何帮助将不胜感激。

【问题讨论】:

  • 我相信即使你不调用方法foo()你也会得到同样的错误。这是因为 Java 在加载类时必须解析本地方法,在调用实际的本地方法之前不会延迟。
  • 你在使用 Proguard 来收缩代码吗?也许 ProGuard 混淆程序更改了该方法的名称。尝试在原生声明中添加“STATIC”:“private static native int myNativeMethod(String arg);”因为从错误日志中我不明白“MyClass.myNativeMethod(..)”是否是指尝试读取 STATIC 方法。
  • @AlexCohn 相信我,在调用myNativeMethod 之前没有错误。我认为它解决了本机方法,但无法链接它们。
  • @emandt Progrard 在调试模式下被禁用。

标签: android reflection android-ndk runtime android-native-library


【解决方案1】:

我不确定,但在尝试使用 Object.getClassLoader() 获取对象的 ClassLoader 并尝试获取未找到的对象方法时,我遇到了类似的问题。我通过对“parent”参数使用“ClassLoader.getSystemClassLoader()”而不是“myContext.getClassLoader()”解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多