【问题标题】:Using Gstreamer for Android with JNA & gst1-java-core?将 Gstreamer for Android 与 JNA 和 gst1-java-core 一起使用?
【发布时间】:2021-03-12 08:33:42
【问题描述】:

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

这个问题与简单地让 Gstreamer 在 Android 上运行无关,而是在一个新的 Native 项目中使用 Android Studio 中预先存在的原生 Java 包装库 gst1-java-coreJNA 在 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 并将其添加到直接在“app/”内的“libs/”文件夹。

完成此操作后,我修改了 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 并获取其中任何一个并尝试构建和运行但没有任何改变。 p>

然后我尝试将其添加到 local.propertiesgradle.properties 同时(以及 time),仍然会发生相同 错误

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

所以现在的问题是;有没有人通过 JNA 让 gst1-java-core 与 Android 一起工作,或者任何人都可以指出我在导入这个库方面可能做错了什么的正确方向? 任何帮助将不胜感激。

【问题讨论】:

  • 您是否使用过其他一些可用的 webrtc 库?我有一个 RPi gstreamer 设置,以及带有这个库 github.com/webrtc-sdk/android 的 android 应用程序,我感觉遇到了奇怪的兼容性问题......
  • 实际上是的。我最近完全离开了 Gstreamer,并使用了 WebRTC 自己的 Android SDK 和一个全新的信令服务器,它工作得更好。我确实遇到了一个奇怪的错误,这可以在我自己回答的其他问题之一中看到,哈哈。
  • 是这个'org.webrtc:google-webrtc:1.0.+'还是那个'com.github.webrtc-sdk:android:992.4515.03'?您是否同时连接了两个 Android 设备或浏览器?我目前面临这里描述的问题stackoverflow.com/questions/70227183/…

标签: java android gstreamer jna java-gstreamer


【解决方案1】:

因此,我对 Android 及其子系统的了解不足是我的错误,即使 Android 主要是用 Java 开发的,它也不支持“本机”运行 Java。这意味着 JNI 不相关,因为根据 Wikipedia 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 编程。但绝对可行,教程也不错。

【讨论】:

  • 所以不仅我觉得 gstreamer 文档很模糊 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多