首页 > 解决方案 > 没有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 拐杖的小修复?

标签: androidopencvandroid-ndkadb

解决方案


在很大程度上,你“做错了”。但是,如果您想做您似乎正在尝试做的事情不受限制,并且愿意永久绑定在 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,以便其他东西可以。


推荐阅读