我正在尝试使用 Java 反射加载一个 Android 本机库,但在运行时找不到该库。通常我加载一个本机库:
System.loadLibrary("mylib");
一切都按预期工作。现在我尝试loadLibrary
用反射调用该方法,如下所示:
Class<?> system = Class.forName("java.lang.System");
Method loadLibrary = system.getDeclaredMethod("loadLibrary", String.class);
loadLibrary.invoke(null, "mylib");
但在运行时我得到:
Caused by: java.lang.UnsatisfiedLinkError: Library mylib not found; tried [/system/lib64/libmylib.so, /vendor/lib64/libmylib.so]
at java.lang.Runtime.loadLibrary0(Runtime.java:1001)
at java.lang.System.loadLibrary(System.java:1530)
at java.lang.reflect.Method.invoke(Native Method)
似乎通过反射loadLibrary
在错误的路径中查找库。这些/system/lib64:/vendor/lib64
是java.library.path
属性的路径,但它不会在 apk 内部查看。当然,该库存在于最终的 apk 中,并且位于正确的位置,用于正确的 ABI。
笔记
我无法使用
System.load("absolute-path-to-lib/mylib.so");
因为从我打电话的地方我没有可用的路径,我没有任何Context
或Application
可用的路径来检索路径。
你知道如何强制loadLibrary
搜索当前的 apk 吗?谢谢!