Android NDK ADB исполняемый без Java - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь запустить исполняемый файл c ++ на эмуляторе Android через оболочку adb.

Я использую opencv.

Все отлично работает и код работает нормально, но мне нужно знать, как отобразить изображение, используя cv::imshow(...).Я понимаю, что это может быть невозможно без прохождения JNI и присоединения этого кода к реальному приложению для Android, которое может быть встроено в apk.Но это НЕ то, что я хочу сделать в данный момент.

Мне просто нужно иметь возможность делать что-то вроде

adb shell am start -d file:///path/to/someimage/someimage.jpg -t image/jpg -a android.intent.action.VIEW

с помощью кода C ++.

В настоящее время я получаю следующую ошибку, когда пытаюсь вызвать cv::imshow(...) через мой код C ++, а затем запустить exe через оболочку adb:

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?

1 Ответ

0 голосов
/ 29 декабря 2018

В значительной степени, вы «все делаете неправильно».Но если вы хотите сделать то, что, по-видимому, пытаетесь сделать независимо от ограничений, и хотите быть постоянно привязанными к работе под оболочкой adb , тогда есть способ.

По существу:

  • У вас есть команда оболочки, которая работает.
  • У вас есть программа, которая хочет выполнить эту команду.
  • Выполнениеконтексты программы и команды оболочки совпадают

Это задание для system() syscall

#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 или, возможно, вызвать ее как подпроцесс.И, как подпроцесс, вы, вероятно, не сможете отправлять Intents, но вы все равно можете связываться с владельцем приложения с помощью каналов или сокетов, и он может отображать изображение или отправлять Intent от вашего имени, чтобы что-то еще было.

...