我需要在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。中有许多JNI方法,因此当您使用dalvikvm命令时,它们在默认情况下不受约束。不幸的是,您不能只执行System.loadLibrary(“android_runtime”),因为这实际上并未绑定(bind)所有 native 方法。

但是,经过一番挖掘,结果发现存在一个内部的,非公共(public)的,不保证存在的名为com.android.internal.util.WithFramework的类,其目的是加载libandroid_runtime.so并绑定(bind)其所有JNI方法。

要使用它,只需在dalvikvm命令上将com.android.internal.util.WithFramework放在类名前面,如下所示:

dalvikvm -cp /some/path/classes.dex com.android.internal.util.WithFramework my.example.cls "This is an argument"

(注意:由于WithFramework类为removed in M,因此仅适用于M之前的设备-感谢@JaredRummler的注意)

关于android - DalvikVM上的CLI在JNI lib上失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13000561/

10-09 05:19