【发布时间】:2021-03-12 08:33:42
【问题描述】:
在我们开始之前,请允许我说,我知道可以使用 C 代码将 Gstreamer 本地集成到 Android 中,就像在 Android Tutorials 中所做的那样。
这个问题与简单地让 Gstreamer 在 Android 上运行无关,而是在一个新的 Native 项目中使用 Android Studio 中预先存在的原生 Java 包装库 gst1-java-core 和 JNA 在 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.properties 和 gradle.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