我正在尝试通过 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 拐杖的小修复?
最佳答案
在很大程度上,你“做错了”。但是,如果你想做你似乎想做的事情,而不受限制,并愿意永久绑定(bind)在 adb 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的android NDK adb可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53965389/