沉舟侧畔千帆进,病树前头万木春。这篇文章主要讲述在Android上为MediaStreamer2控制台应用程序提供JVM相关的知识,希望能为你提供帮助。
我正在为嵌入式设备开发android固件,该设备使用rtp流式传输编码视频信号。底层库是MediaStreamer2,因为它带有Android支持,各种编解码器和libortp。因此,我将libmediastreamer及其依赖项集成到我的固件构建过程中。
作为第二步,我编写了一个简单的Android命令行应用程序作为PoC,它通过网络传输音频或视频。不幸的是,第一次打电话给ms_init()
失败的原因是:
bctbx-fatal-调用ms_get_jni_env()而没有使用ms_set_jvm()设置jvm
更深入地研究问题,似乎Androids版本的libmediastreamer是从NDK的角度设计的:它可以被称为Android应用程序的一部分,因此自动获得对JVM(DVM?)的引用。不幸的是,这不是我的用例。
我试图删除依赖项(查询Sdk版本,硬件回声取消支持等)但没有成功。所以我的下一个方法是手动启动VM并将其传递给库。我尝试过Oracles API,例如:
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和非root设备上为Android构建shell的可执行文件,请参阅参考How to build an executable for 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...
";
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*);
【在Android上为MediaStreamer2控制台应用程序提供JVM】您可以参考以下内容查看它们是否有用:
- how-to-create-a-jvm-instance-in-jni
- https://calebfenton.github.io/2017/04/05/creating_java_vm_from_android_native_code/
推荐阅读
- 我如何在android studio模拟器中运行vuzix android glass应用程序()
- 用于Android的不同屏幕密度的文件夹
- Xcode 10 app上传卡在“谈判连接......”
- ModelMapper如何使用条件
- 如何修改application.yml中的info.app.name()
- 如何在app.on(“before-quit”)中使用shutdown.bat停止Tomcat()
- com.apple.AuthenticationServices.Authorization错误代码1000
- 由于ZIP的结构,使用kudu ZipDeploy的Azure webapp部署失败
- TypeError(RN 0.61.2)(_ firebaseApp.default.messaging不是函数)