我正在编写使用 GStreamer 的 JNI 库。我正在与 Android 项目分开编写 JNI 代码,因此我使用 CMake 构建 JNI 库,然后将 .so 文件复制到 Android 项目。
问题是,当我尝试在 JNI 代码中创建元素时,例如:
auto source = gst_element_factory_make("videotestsrc", "source");
gst_element_factory_make 返回 nullptr。
我找到了一个示例,说明如何使用 CMake 通过 Gstreamer 编写 JNI 内容。我也发现了 问题 在 stackoverflow 上,这与我的问题类似,但不幸的是,由于某种原因,该问题的解决方案对我不起作用。
在 gstreamer_android.cpp 中(构建为 gstreamer_android.so):
...
GST_PLUGIN_STATIC_DECLARE_C(coreelements);
GST_PLUGIN_STATIC_DECLARE_C(videotestsrc);
void gst_android_register_static_plugins() {
GST_PLUGIN_STATIC_REGISTER(coreelements);
GST_PLUGIN_STATIC_REGISTER(videotestsrc);
__android_log_print (ANDROID_LOG_INFO, TAG, "plugins registered");
}
...
在 my_gstreamer_lib.cpp (构建为 my-gstreamer-lib.so)中,我有“addTrack”本机函数,我在其中构建管道,例如这部分:
...
auto source = gst_element_factory_make("videotestsrc", "source");
if (
!source
) {
__android_log_print (ANDROID_LOG_ERROR, TAG, "videotestsrc couldn't be created");
return;
}
...
所以,我总是收到“videotestsrc无法创建”错误。我想要创建的所有元素都会发生同样的情况,而不仅仅是“videotestsrc”。
我尝试将此代码片段放入“GST_PLUGIN_STATIC_REGISTER(videotestsrc);”之后的“gstreamer_android.cpp”中就可以了。但由于某种原因在我的“my_gstreamer_lib.cpp”中不起作用。
我的 Android 课程是:
NativeTest.kt
package com.my.playground
import android.content.Context
import android.util.Log
import android.widget.Toast
import org.freedesktop.gstreamer.GStreamer
class NativeTest {
companion object {
init {
System.loadLibrary("my-gstreamer-lib")
}
}
external fun addTrack(trackID: Int, filepath: String)
}
GStreamer.kt
package org.freedesktop.gstreamer
import android.content.Context
class GStreamer {
companion object {
init {
System.loadLibrary("gstreamer_android")
}
@JvmStatic
@Throws(Exception::class)
external fun nativeInit(context: Context)
@Throws(Exception::class)
fun init(context: Context) {
nativeInit(context)
}
}
}
MainActivity.kt
package com.my.playground
import ...
class MainActivity : ComponentActivity() {
private lateinit var nativeInterface: NativeTest
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
...
}
startLib()
}
private fun startLib() {
try {
GStreamer.init(this)
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(this, e.message, Toast.LENGTH_LONG).show()
finish()
return
}
nativeInterface = NativeTest()
// add track
nativeInterface.addTrack(
0,
File(filesDir, "sample.mp4").absolutePath
)
}
companion object {
private const val READ_EXTERNAL_STORAGE_PERMISSION = "READ_EXTERNAL_STORAGE"
}
}
在 CMakeLists.txt 中,我链接了示例中提到的所有库和插件,以及“gstcoreelements”和“gstvideotestsrc”。
如有任何帮助,我们将不胜感激。
当我以this方式组织我的项目时,问题已解决。