微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 Gstreamer for Android 与 JNA 和 gst1-java-core 一起使用?

如何解决将 Gstreamer for Android 与 JNA 和 gst1-java-core 一起使用?

在我们开始之前,请允许我说我知道可以使用 C 代码将 Gstreamer 本地集成到 Android 中,就像在 Android Tutorials 本身中所做的那样。

这个问题与简单地让 Gstreamer 在 Android 上运行无关,而是与使用预先存在的本机 Java 包装库 gst1-java-core 和 Android Studio 内的 JNA 在新的 Native 中在 Android 上运行有关项目。但是,如果本机 C 代码是唯一的方法,请让我知道您是否尝试过我尝试做的但失败了。

让我们开始吧。

系统信息

  • 操作系统:Linux Ubuntu 18.04
  • Android Studio 版本:4.1.2
  • Java 版本:8
  • SDK 版本:30(针对 API 21)
  • NDK 版本:21(也尝试了 23)
  • 测试设备:Samsung galaxy Tab S6 Lite(虽然还没到)

过程包括在 Android Studio 中设置一个全新的项目,并选择 Native C++ 作为项目模板,然后保持其他所有内容包括工具链)的认值。一旦项目构建完成并完成了它的 Gradle 业务,我就做了通常的 git init 并在 Git 中进行设置。之后,我直接从 releases page 下载并添加了 gst1-java-core-1.4.0.jar 到“libs/”中的“app/” >”文件夹。

完成此操作后,我修改了 app 目录中的 build.gradle 文件以匹配此 Gradle Gist

然后自然而然地跟着 Gradle 同步,当它正确完成时,我转到我的 MainActivity.java添加了两行代码。 首先在顶部:

import org.freedesktop.gstreamer.Gst;

然后在 onCreate 方法中:

Gst.init();

然后产生了这个错误

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rcbappnative,PID: 9644
java.lang.UnsatisfiedLinkError: Could not load library: gstreamer
    at org.freedesktop.gstreamer.lowlevel.GstNative.load(GstNative.java:56)
    at org.freedesktop.gstreamer.lowlevel.GstNative.load(GstNative.java:46)
    at org.freedesktop.gstreamer.lowlevel.GstAPI.<clinit>(GstAPI.java:37)
    at org.freedesktop.gstreamer.Gst.getVersion(Gst.java:144)
    at org.freedesktop.gstreamer.Gst.init(Gst.java:473)
    at org.freedesktop.gstreamer.Gst.init(Gst.java:419)
    at com.example.rcbappnative.MainActivity.onCreate(MainActivity.java:25)
    at android.app.Activity.performCreate(Activity.java:7963)
    at android.app.Activity.performCreate(Activity.java:7952)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3629)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3806)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2267)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:237)
    at android.app.ActivityThread.main(ActivityThread.java:8167)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)

然后我继续尝试通过遵循 Gstreamers installation instructions for Android 下载与我的 NDK 版本 (gstreamer-1.0-android-universal-1.18.3.tar.xz) 匹配的二进制文件,然后将它们解压缩到然后由环境变量

GSTREAMER_ROOT_ANDROID=/home/user/Android/gstreamer

指向的文件

我将此环境变量添加~/.project 以及 ~/.bashrc获取其中任何一个并尝试构建和运行,但没有任何改变。 >

然后我尝试将它添加local.propertiesgradle.properties 同时(也一个time) 并且仍然会发生相同 错误

gstreamer-java 的 github 提供的 Java Examples 在我的机器上运行得很好,所以它似乎不是系统范围的错误,而是 Android 环境特定的错误,它以某种方式无法加载库。也许是因为它不知道寻找那个环境变量。

所以现在的问题是;有没有人通过 JNA 获得 gst1-java-core 与 Android 一起工作,或者有人能指出我在导入这个库时可能做错的事情的正确方向吗? 非常感谢任何帮助。

解决方法

所以我的错误是对 Android 和子系统的了解不够,知道即使 Android 主要是用 Java 开发的,它也不支持“本地”运行 Java。这意味着 JNI 不相关,因为根据维基百科 JNI 是:

在软件设计中,Java Native Interface是一种外部函数接口编程框架,它使Java虚拟机中运行的Java代码能够调用和被其他语言编写的本地应用程序和库调用,例如C、C++和汇编

这么说吧 - 因为 Android 不运行 JVM,而是在 Linux 内核上运行 Native C,这意味着目前无法在 Android 上尝试通过 JNI 集成“java 包装器”。

因此 - 通用解决方案和以下 Gstreamers official tutorials 似乎是目前在 Android 中使用 Gstreamer 的唯一方法

我只能怪自己认为其他人都“错过”了 JNI 和 gst1-java-core,而且我以某种方式比 Gstreamer 官方网站本身更了解

我想回答这个问题,因为如果其他人走错了路,我现在可以正式建议遵循官方教程并使用 Native 创建一个 Android 应用程序支持,以便您可以直接从 Gstreamer 编译和集成 C 代码,然后让您的应用程序像这样工作。

我目前可以说,按照上述段落的建议,我创建了一个可用的 Android 应用程序,其中 Gstreamer 实时流目前已启动并使用自定义管道运行。我不会说这很容易。因为它不是;特别是如果您不擅长 C 编程。但这绝对是可行的,而且教程很好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。