Предоставление JVM для консольного приложения MediaStreamer2 на Android - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю над прошивкой Android для встроенного устройства, которое транслирует закодированный видеосигнал с использованием rtp.Основной библиотекой является MediaStreamer2, потому что она поставляется с поддержкой Android, различными кодеками и libortp.Поэтому я интегрировал libmediastreamer и его зависимости в процесс сборки прошивки.

В качестве второго шага я написал простое приложение для командной строки Android в виде PoC, которое транслирует аудио или видео по сети.К сожалению, первый вызов ms_init() завершается неудачно из-за:

bctbx-fatal-Calling ms_get_jni_env (), в то время как jvm не был установлен с помощью ms_set_jvm ()

Копатьнемного глубже в этой проблеме, кажется, что Android-версия libmediastreamer была разработана с точки зрения NDK: она может быть вызвана как часть приложения Android и, следовательно, автоматически получает ссылку на JVM (DVM?).К сожалению, это не мой случай использования.

Я пытался удалить зависимости (запрос версии Sdk, поддержка аппаратного эхоподавления и т. Д.), Но безуспешно.Поэтому мой следующий подход - запуск виртуальной машины вручную и передача ее в библиотеку.Я пробовал API-интерфейсы для Oracle:

JNIEnv env;
JavaVM vm;
JavaVMInitArgs vm_args;
JavaVMOption options[4];
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-verbose:jni"; 
vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = 4;
vm_args.ignoreUnrecognized = TRUE;
jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);

Но приложение закрывается с простым «прерыванием».Тем не менее, я не уверен, что это путь, потому что это мир Android и Dalvik.

Есть предложения?

1 Ответ

0 голосов
/ 22 февраля 2019

Возможно создать исполняемый файл для оболочки на Android как на рутованных, так и на некорневых устройствах, см. Ссылку Как создать исполняемый файл для оболочки Android .

Попробуйте приведенный ниже код и соберите его, используя NDK, чтобы получить исполняемый файл:

#include <jni.h>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char **argv) {

   JavaVMOption jvmopt[1];
   jvmopt[0].optionString = "-Djava.class.path=" + ".";

   JavaVMInitArgs vmArgs;
   vmArgs.version = JNI_VERSION_1_2;
   vmArgs.nOptions = 1;
   vmArgs.options = jvmopt;
   vmArgs.ignoreUnrecognized = JNI_TRUE;

   // Create the JVM
   JavaVM *javaVM;
   JNIEnv *jniEnv;
   long flag = JNI_CreateJavaVM(&javaVM, (void**)
      &jniEnv, &vmArgs);
   if (flag == JNI_ERR) {
      cout << "Error creating VM. Exiting...\n";
      return 1;
   }

   /** ----------------------------------------------
    * Put your own JNI related code from here if any. 
    * -----------------------------------------------
    **/

   javaVM->DestroyJavaVM();
   return 0;
}

Проверьте <jni.h>, какие интерфейсы вы можете использовать, например,

/*
 * VM initialization functions.
 *
 * Note these are the only symbols exported for JNI by the VM.
 */
jint JNI_GetDefaultJavaVMInitArgs(void*);
jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);

Вы можете обратиться к ниже, чтобы узнать, насколько они полезны:

  1. как создать jvm-экземпляр-в-jni
  2. https://calebfenton.github.io/2017/04/05/creating_java_vm_from_android_native_code/
...