为Android上的MediaStreamer2控制台应用提供JVM
Providing a JVM for MediaStreamer2 Console Application on Android
我正在为嵌入式设备的Android固件处理,该设备使用RTP流式传输编码的视频信号。基础库是MediaStreamer2,因为它带有Android支持,各种编解码器和Libortp。因此,我将libmediastreamer及其依赖项集成到我的固件构建过程中。
作为第二步,我编写了一个简单的Android命令行应用程序作为POC,该应用程序通过网络流式传输音频或视频。不幸的是,ms_init()
的第一个呼吁由于以下方式失败:
bctbx-fatal-calling ms_get_jni_env(),而没有使用ms_set_jvm()
设置了jvm从NDK的角度设计了Androids版本的LibMediasTreamer,似乎可以将其称为Android App的一部分,因此可以自动获取对JVM(DVM?)的引用,从而使Androids版本的libmediastreameer版本似乎更深入地研究了(DVM?),
,
。。不幸的是,这不是我的用例。
我试图删除依赖项(查询SDK版本,硬件回声取消支持等),而没有成功。因此,我的下一个方法是手动启动VM并将其传递给图书馆。我尝试了oracles apis:
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世界。
有什么建议吗?
可以在根和非根系设备上构建Android上的shell可执行文件,请参阅参考如何为Android Shell构建可执行文件。
尝试以下代码并使用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*);
您可以参考以下查看它们是否有帮助:
- 操作方法创作-A-JVM-In-jni-in-jni
- https://calebfenton.github.io/2017/04/05/creating_java_vm_vm_from_from_android_native_code/
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- c++r值引用应用于函数指针
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 有没有任务栏API可以立即应用注册表更改
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 在 UWP C++应用程序中生成 JVM 时崩溃
- 为Android上的MediaStreamer2控制台应用提供JVM
- 通过 JNI 从应用程序创建 JVM 后C++找不到类
- 如何在构建器C++应用程序中使用JNI启动JVM