Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android DalvikVM上的CLI在JNI lib上失败_Android_Android Ndk_Java Native Interface_Dalvik - Fatal编程技术网

Android DalvikVM上的CLI在JNI lib上失败

Android DalvikVM上的CLI在JNI lib上失败,android,android-ndk,java-native-interface,dalvik,Android,Android Ndk,Java Native Interface,Dalvik,我需要在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)

我需要在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)
java.lang.unsatifiedLinkError:println\u native
位于android.util.Log.println_native(本机方法)
位于android.util.Log.i(Log.java:159)
位于org.slf4j.impl.AndroidLogger.info(AndroidLogger.java:151)
位于org.gihon.client.TunnelingClient.(TunnelingClient.java:62)
位于org.gihon.client.CLI.main(CLI.java:95)
在dalvik.system.NativeStart.main(本机方法)
我尝试设置环境变量,设置LD_LIBRARY_PATH和BOOTCLASSPATH变量。我甚至尝试用LD_PRELOAD预加载liblog,但没有解决这个问题。
dalvikvm设置环境的方式似乎有问题/不同。

问得好!我得挖点洞才能弄明白

在libandroid_运行时中有大量JNI方法,因此在使用dalvikvm命令时,默认情况下不会绑定这些方法。不幸的是,您不能只执行System.loadLibrary(“android_运行时”),因为这实际上并不绑定所有本机方法

然而,经过一些挖掘,发现有一个名为com.android.internal.util.WithFramework的内部、非公共、不保证存在的类,其目的是加载libandroid_runtime.so并绑定其所有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"

(注意:这只适用于pre-M设备,因为WithFramework类是-感谢heads up@JaredRummler)

对于android M,我发现这个方法是可行的。
创建helloworld.sh脚本以随您的jar\zip文件一起使用:

#!/system/bin/sh
# Copied by example from am command
base=/system
export CLASSPATH=/path/to/your/jar/HelloWorld.jar
exec app_process $base/bin HelloWorldMainClass "$@"
似乎在启动java代码时加载了所有java类和共享库,因此您可以同时使用SDK类,如android.util.log.log和“secret”本机类,如ActivityManagerActive,它们在其他adb shell命令中使用,但在SDK中不存在。

顺便说一句,对于我创建的Javashell命令,我不得不对上述类使用反射,因为在我看来,如果不克隆和构建整个AOSP,就无法正确编译。。。

如果有人知道一种更简单的方法,例如在java代码中使用ActivityManagerActive而不进行反射,我将非常感谢您的帮助。

您用来启动它的命令是什么。。。从这里开始。我想我很幸运在我的设备上安装了WithFramework,它可以工作。是的,几乎可以肯定所有设备上都安装了WithFramework。但它并不一定会存在,而且可能会在未来消失/改变。(与任何非公共api一样)
System.load(“/System/lib/libandroid_runtime.so”)
?@AwaisKing这里有一个问号,但我没有看到问题?
com.android.internal.util.WithFramework
将在android m中删除。回答我自己的问题:您可以为您知道将要使用的类和方法创建存根实现,而针对应用程序进行编译的过程需要根用户访问设备,而dalvikvm不允许?由于大多数用户都会使用adb shell运行这个程序,所以对我来说这似乎不是什么大问题。如果这对您来说是个问题,您当然可以尝试直接运行dalvikvm。如果你有一个简单的方法,请把它贴在这里。我认为一个可能的解决办法是尝试理解和管理一种使用系统的方法。加载所有需要的东西。说起来容易做起来难。托尔斯多耶夫斯基,实际上你的答案至少在运行android Oreo(及以上)的设备上有效。你不需要根。可能需要一些基于android shell时间的配置,如导出android_数据和/或设置路径和LD_库路径