Andoird,JNI:当我尝试创建管道元素时,gst_element_factory_make 返回 nullptr

问题描述 投票:0回答:1

我正在编写使用 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”。

如有任何帮助,我们将不胜感激。

android java-native-interface gstreamer
1个回答
0
投票

当我以this方式组织我的项目时,问题已解决。

© www.soinside.com 2019 - 2024. All rights reserved.