android - 没有java的android NDK adb可执行文件
问题描述
我正在尝试通过 adb shell 在 android 模拟器上运行 c++ 可执行文件。
我正在使用opencv。
一切正常,代码工作正常,但我需要知道如何使用cv::imshow(...)
. 我知道如果不通过 JNI 并将此代码附加到可以构建到 apk 中的实际 android 应用程序,这可能是不可能的。但这不是我目前想要做的。
我只需要能够做类似的事情
adb shell am start -d file:///path/to/someimage/someimage.jpg -t image/jpg -a android.intent.action.VIEW
通过 C++ 代码。
当我尝试cv::imshow(...)
通过我的 c++ 代码调用然后通过 adb shell 运行 exe 时,我目前收到以下错误:
terminate called after throwing an instance of 'cv::Exception'
what(): openCV(3.4.3) /build/3_4_pack-android/opencv/modules/highgui/src/window.cpp:632:error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.X or Carbon support. If you are on Ubutu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script function in 'cvShowImage'
是否有一个链接器标志我可以添加到 LOCAL_LDLIBS 或其他一些我可以用来让它工作而无需使用 java/JNI 拐杖的小修复?
解决方案
在很大程度上,你“做错了”。但是,如果您想做您似乎正在尝试做的事情而不受限制,并且愿意永久绑定在 adb shell 下运行,那么有一种方法。
本质上:
- 你有一个有效的 shell 命令。
- 你有一个程序想要执行这个命令。
- 程序和shell命令的执行上下文是一样的
这是system()
系统调用的工作
#include <stdlib.h>
int system(const char *command);
所以你会做类似的事情
system("am start -d file:///path/to/someimage/someimage.jpg -t image/jpg -a android.intent.action.VIEW)
...大概命令字符串是您在运行时构建的东西,填写文件名等。
当然,这距离在 Android 上部署任何东西还有很长的路要走,除非你的意思是总是通过 adb 操作。要到达您应该面临的更大挑战是将您的可执行文件转换为 jni 子例程,或者可能将其作为子进程调用。作为一个子进程,您可能无法发送 Intent - 但您仍然可以使用管道或套接字与拥有的应用程序进行通信,并让它显示图像或代表您发送 Intent,以便其他东西可以。
推荐阅读
- java - Java Threads isInterrupted(),为什么没有出现这个输出
- java - 在将它们添加到数组之前检查用户输入了多少数据点以避免索引超出范围异常
- javascript - 在电子生成器反应电子应用程序后,在 Windows 中出现黑屏
- html - 页脚比 div 好吗?
- firebase - 用颤振将数据发送到firebase
- rust - 是否可以选择让 rustc 显示“成功”消息?
- java - 何时/在何处创建与数据库通信的我的类的新对象
- python - 每 15 分钟从数据库中删除一次数据,但出现错误——Discord.py
- reactjs - ReactJS 按 Asc/Desc 排序不从嵌套组件呈现排序列表
- javascript - 如何在 Gatsby 中的全局 CSS onclick 之间切换?