【问题标题】:Android execute native library from Runtime.exec() or Java.Process()Android 从 Runtime.exec() 或 Java.Process() 执行本机库
【发布时间】:2019-09-17 12:07:03
【问题描述】:

使用最新的Android Q 更难或在某些情况下不可能execute native executables/data/data/com.example/files/example.so

例如,我正在执行 C/C++ 可执行文件: Process.exec("/data/data/com.example/files/example.so -a -e -n 192.168.1.1") 并从InputStreamReader(process.inputStream) 获取其输出。

我只是想知道是否有办法从 Java Native e.x 加载库:

System.loadlibrary("example") 之后发送与上述相同的command 并直接从中获取output

谢谢

P.s : 如果可能的话,一个例子会很棒!

https://repl.it/repls/CookedLoyalProfiles

如何转换像传递这样的东西:"executable -a -e -n"JNI callread the output

【问题讨论】:

  • @Onik,感谢您的评论。我了解如何构建可执行文件,但我不知道如何将“executable -a -e -n”之类的内容转换为 JNI 调用并读取输出
  • .so 文件通常不是可执行,而是可加载
  • @DavisHerring,我知道但是要将它们包含在 APK 文件中应该在最后添加 lib.so
  • 好的——我只是想确定你想对它采取什么行动。
  • 我很惊讶您的可执行文件位于 files 下。如果你把它命名为正确,如libexectutable.so,你会发现它在lib下自动解压,您可以从那里使用Process.exec() 运行它。

标签: java android c++ c java-native-interface


【解决方案1】:

将您的exectuable 文件重命名为libexectutable.so 将其放入您的项目app/src/main/jniLibs/arm64-v8a 文件夹中。

File workdir = new File(getApplicationInfo().nativeLibraryDir);
Process process = new ProcessBuilder("./libexectutable.so", "-some-args").directory(workdir).start();
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
// maybe a while loop
in.readLine(); // represent one line output of the process

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多