我需要在 Android 上运行 java 应用程序的命令行版本(是的,我知道这并不简单)。
我尝试使用 Dalvikvm 启动它,它实际上启动了,但后来我的代码失败了,因为它开始使用 android.util.log 并抛出此异常。
java.lang.UnsatisfiedLinkError: println_native
at android.util.Log.println_native(Native Method)
at android.util.Log.i(Log.java:159)
at org.slf4j.impl.AndroidLogger.info(AndroidLogger.java:151)
at org.gihon.client.TunnelingClient.<init>(TunnelingClient.java:62)
at org.gihon.client.CLI.main(CLI.java:95)
at dalvik.system.NativeStart.main(Native Method)
我尝试设置环境变量,设置 LD_LIBRARY_PATH 和 BOOTCLASSPATH 变量。我什至尝试使用 LD_PRELOAD 预加载 liblog 但没有解决这个问题。
dalvikvm 设置环境的方式似乎有问题/不同。
好问题!我必须深入挖掘才能弄清楚这一点。
libandroid_runtime.so 中有大量 JNI 方法,当您使用 dalvikvm 命令时,默认情况下它们不会被绑定。不幸的是,您不能只执行 System.loadLibrary("android_runtime"),因为这实际上并没有绑定所有本机方法。
然而,经过一番挖掘,发现有一个内部的、非公共的、不能保证存在的类,名为 com.android.internal.util.WithFramework,其目的是加载 libandroid_runtime.so 并绑定其所有 JNI 方法。
要使用它,只需扔com.android.internal.util.WithFramework
在 dalvikvm 命令上的类名前面,如下所示:
dalvikvm -cp /some/path/classes.dex com.android.internal.util.WithFramework my.example.cls "This is an argument"
(注意:这仅适用于 M 之前的设备,因为 WithFramework 类是在 M 中删除 https://android-review.googlesource.com/#/c/157981/- 感谢@JaredRummler 的提醒)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)