我拥有播放视频所需的所有.so库和头文件。我想从Raw文件夹播放视频。我对CPP代码感到震惊。无法将视频文件路径传递到CPP代码。以下是我的native-lib.cpp代码
const char *file = env->GetStringUTFChars(path, 0);
if (file == NULL) {
printf("The file is a null object.");
}
av_register_all();
int ret = 0;
char errbuf[256];
AVFormatContext *fmt_ctx = avformat_alloc_context();
int ret12 = avformat_open_input(&fmt_ctx, file, NULL, NULL);
if (ret12 < 0) {
av_strerror(ret, errbuf, sizeof(errbuf));
__android_log_print(ANDROID_LOG_ERROR, "ffmpeg", "%s", errbuf);
__android_log_print(ANDROID_LOG_ERROR, "ffmpeg", "%i", ret12);
return;
}
上面的ret12返回-ve值并且正在将控件返回
不完全是您现在面临的问题,但是当您使用GetStringUTFChars()
时,必须先调用ReleaseStringUTFChars()
,然后再从本机方法返回Java。
现在,当您将文件路径传递给JNI时,它是完整路径还是相对路径?在Android应用中,“当前目录”的开头是/
,即根目录。因此,可能是您的代码找不到该文件。
下一个问题是,您的应用程序是否具有足够的权限来打开此文件。如果文件位于应用程序专用文件夹之外的外部存储中,则需要运行时READ_EXTERNAL_STORAGE权限才能读取该文件。此外,在Android 10上还有其他限制。您的应用程序AndroidManifest.xml中可能需要android:requestLegacyExternalStorage="true"属性。