TL;博士; 我在通过线程将 FFMPEG 原始数据从 C++ 代码传递到 JAVA 代码以进行显示时遇到问题。
有一个服务器将编码帧发送到其客户端。这些编码帧是用一些 FFMPEG 魔法进行编码的。当在客户端接收时,上述帧被解码为原始 RGB 数据(作为 unsigned char *)。现在的问题是帧是在某种“侦听器”中接收的。只是一个在后台运行的线程,轮询服务器并onFrame在新帧可用时运行特定功能。
当前以视频格式显示帧的解决方案是将每个帧保存到 C++ 的内部存储中,然后在FileObserverjava 端在图像写入内存后立即显示图像。遗憾的是,这种方法在手机上生成 6 FPS 视频,而在服务器上生成 10 FPS 视频。
我需要一种将 unsigned char * (jbytearray) 传递给我的 JAVA 代码的方法,这样我就可以解码它并从 RAM 而不是磁盘显示它。
值得一提的是,onFrame函数的参数列表中不能有JNIEnv*&& jobject(库要求)。
到目前为止,我所尝试的是在我的MainActivity方法中创建一个本机方法,通过JNIEnv该jobject方法将它们传递给全局变量
JNIEnv* m_globalEnv = env;
jobject m_globalObject = thiz;
JavaVM m_jvm = 0;
jclass mainActivity = m_globalEnv->GetObjectClass(m_globalObject);
jmethodID testMethod = m_globalEnv->GetMethodID(mainClass, "testMethod", "(I)V");
m_globalEnv->GetJavaVM(&m_jvm);
Run Code Online (Sandbox Code Playgroud)
之后,在我的onFrameI …