将 Gstreamer 用于 Android 和 JNA & gst1-java-core?
Using Gstreamer for Android with JNA & gst1-java-core?
在我们开始之前,请允许我说我知道可以使用 C 代码将 Gstreamer 集成到 Android 中,就像 Android Tutorials 本身所做的那样。
这个问题与简单地在 Android 上获取 Gstreamer 运行 无关,而是 运行 使用预先存在的本机 [=] 在 Android 上获取 Gstreamer [=] 111=] 包装库 gst1-java-core alongside JNA 在新的 Native 项目中 Android Studio 内。但是,如果本机 C 代码是唯一的方法,请告诉我您是否尝试过我正在尝试做的事情但失败了。
让我们开始吧。
系统信息:
- OS: Linux Ubuntu 18.04
- Android工作室版本:4.1.2
- Java版本:8
- SDK 版本:30(目标 API21)
- NDK版本:21(也试过23)
- 测试设备:Samsung Galaxy Tab S6 Lite(虽然还没到)
过程涉及在 Android Studio 中设置一个全新的项目并选择 Native C++ 作为项目模板,然后保持其他一切默认,包括工具链。一旦项目建成并完成,它就是 Gradle 业务,我做了通常的 git init 并在 Git 中设置它。之后我下载并添加了 gst1-java-core-1.4.0.jar 从 releases page 到直接在“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)
然后我继续尝试通过下载与我的 NDK 版本 (gstreamer-1.0-android-universal-1.18.3.tar.xz) 匹配的二进制文件来纠正此问题 Gstreamers installation instructions for Android然后将它们解压缩到环境变量
GSTREAMER_ROOT_ANDROID=/home/user/Android/gstreamer
指向的文件夹中
我也将此环境变量添加到 ~/.project ~/.bashrc 并获取其中任何一个并尝试构建和 运行 但没有任何改变。
然后我尝试将它同时添加到 local.properties 和 gradle.properties (以及 一次一个 )并且仍然 相同 错误发生。
gstreamer-java 的 git 集线器提供的 Java Examples 在我的机器上工作正常所以看起来它不是系统范围的错误而是 Android 环境特定错误,它以某种方式无法加载库。也许是因为它不知道要查找那个环境变量。
所以现在的问题是;有没有人让 gst1-java-core 通过 JNA 与 Android 一起工作,或者任何人都可以指出我在导入这个库方面可能做错了什么的正确方向吗? 非常感谢任何帮助。
所以我对 Android 和子系统了解不够是我的错误,即使 Android 主要是在 Java 中开发的,它也不支持 运行ning Java “本地”。这意味着 JNI 不相关,因为根据维基百科 JNI 是:
In software design, the Java Native Interface is a foreign function interface programming framework that enables Java code running in a Java virtual machine to call and be called by native applications and libraries written in other languages such as C, C++ and assembly
所以说 - 因为 Android 不是 运行 JVM,而是 运行 在 Linux 内核上的本机 C,这意味着尝试集成目前无法在 Android.
上通过 JNI 实现“java 包装器”
因此 - 通用解决方案和以下 Gstreamers official tutorials 目前似乎是 在 Android.[=12= 中使用 Gstreamer 的唯一方法]
我只能怪自己认为其他人都只是“错过”了 JNI 和 gst1-java-core 而我不知何故 比 更了解 Gstreamer 官方网站本身。
不过我想回答这个问题,因为如果有人误入歧途,我现在可以正式建议遵循 官方教程 并创建一个 Android 应用程序具有 Native 支持,以便您可以直接从 Gstreamer 编译和集成 C 代码,然后让您的应用程序像那样工作。
我目前可以说,按照上述段落的建议,我创建了一个可用的 Android 应用程序,其中 Gstreamer 实时流当前正在运行,并且 运行 正在使用自定义管道。我不会说这很容易;因为它不是;特别是如果你不擅长 C 编程。不过绝对可行,教程也不错
在我们开始之前,请允许我说我知道可以使用 C 代码将 Gstreamer 集成到 Android 中,就像 Android Tutorials 本身所做的那样。
这个问题与简单地在 Android 上获取 Gstreamer 运行 无关,而是 运行 使用预先存在的本机 [=] 在 Android 上获取 Gstreamer [=] 111=] 包装库 gst1-java-core alongside JNA 在新的 Native 项目中 Android Studio 内。但是,如果本机 C 代码是唯一的方法,请告诉我您是否尝试过我正在尝试做的事情但失败了。
让我们开始吧。
系统信息:
- OS: Linux Ubuntu 18.04
- Android工作室版本:4.1.2
- Java版本:8
- SDK 版本:30(目标 API21)
- NDK版本:21(也试过23)
- 测试设备:Samsung Galaxy Tab S6 Lite(虽然还没到)
过程涉及在 Android Studio 中设置一个全新的项目并选择 Native C++ 作为项目模板,然后保持其他一切默认,包括工具链。一旦项目建成并完成,它就是 Gradle 业务,我做了通常的 git init 并在 Git 中设置它。之后我下载并添加了 gst1-java-core-1.4.0.jar 从 releases page 到直接在“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)
然后我继续尝试通过下载与我的 NDK 版本 (gstreamer-1.0-android-universal-1.18.3.tar.xz) 匹配的二进制文件来纠正此问题 Gstreamers installation instructions for Android然后将它们解压缩到环境变量
GSTREAMER_ROOT_ANDROID=/home/user/Android/gstreamer指向的文件夹中
我也将此环境变量添加到 ~/.project ~/.bashrc 并获取其中任何一个并尝试构建和 运行 但没有任何改变。
然后我尝试将它同时添加到 local.properties 和 gradle.properties (以及 一次一个 )并且仍然 相同 错误发生。
gstreamer-java 的 git 集线器提供的 Java Examples 在我的机器上工作正常所以看起来它不是系统范围的错误而是 Android 环境特定错误,它以某种方式无法加载库。也许是因为它不知道要查找那个环境变量。
所以现在的问题是;有没有人让 gst1-java-core 通过 JNA 与 Android 一起工作,或者任何人都可以指出我在导入这个库方面可能做错了什么的正确方向吗? 非常感谢任何帮助。
所以我对 Android 和子系统了解不够是我的错误,即使 Android 主要是在 Java 中开发的,它也不支持 运行ning Java “本地”。这意味着 JNI 不相关,因为根据维基百科 JNI 是:
In software design, the Java Native Interface is a foreign function interface programming framework that enables Java code running in a Java virtual machine to call and be called by native applications and libraries written in other languages such as C, C++ and assembly
所以说 - 因为 Android 不是 运行 JVM,而是 运行 在 Linux 内核上的本机 C,这意味着尝试集成目前无法在 Android.
上通过 JNI 实现“java 包装器”因此 - 通用解决方案和以下 Gstreamers official tutorials 目前似乎是 在 Android.[=12= 中使用 Gstreamer 的唯一方法]
我只能怪自己认为其他人都只是“错过”了 JNI 和 gst1-java-core 而我不知何故 比 更了解 Gstreamer 官方网站本身。
不过我想回答这个问题,因为如果有人误入歧途,我现在可以正式建议遵循 官方教程 并创建一个 Android 应用程序具有 Native 支持,以便您可以直接从 Gstreamer 编译和集成 C 代码,然后让您的应用程序像那样工作。
我目前可以说,按照上述段落的建议,我创建了一个可用的 Android 应用程序,其中 Gstreamer 实时流当前正在运行,并且 运行 正在使用自定义管道。我不会说这很容易;因为它不是;特别是如果你不擅长 C 编程。不过绝对可行,教程也不错