始める前に、 Android チュートリアル自体で行ったように、C コードを使用してネイティブに Gstreamer を Android に統合できることを知っていることを言っておきます。
この質問は単に Android で Gstreamer を実行することとは関係ありませんが、既存のネイティブ Java ラッパー ライブラリgst1-java-coreを新しいネイティブ プロジェクトの Android Studio 内のJNAと一緒に使用して Android で実行することとは関係ありません。ただし、ネイティブ C コードが唯一の方法である場合は、私がやろうとしていることを試して失敗したかどうかをお知らせください。
さぁ、始めよう。
システム情報:
- OS: Linux Ubuntu 18.04
- アンドロイド スタジオ バージョン: 4.1.2
- Java バージョン: 8
- SDK バージョン: 30 (ターゲット API 21)
- NDK バージョン: 21 (23 も試しました)
- テストデバイス: Samsung Galaxy Tab S6 Lite (まだそこに到達していませんが)
プロセスには、Android Studio でまったく新しいプロジェクトを設定し、ネイティブ C++ をプロジェクト テンプレートとして選択した後、ツールチェーンを含む他のすべてをデフォルトのままにする必要がありました。プロジェクトがビルドされて終了したら、Gradle ビジネスです。通常のgit initを実行し、Git でセットアップしました。その後、gst1-java-core-1.4.0.jar をダウンロードして、リリース ページから「 app/」フォルダー内の「 libs/」に直接追加しました。
完了したら、このGradle Gistと一致するように app ディレクトリの build.gradle ファイルを変更しました。
その後、Gradle 同期が自然に行われ、それが正しく完了したら、MainActivity.javaに移動し、合計 2 行のコードを追加しました。まず一番上に:
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)
次に、Android 用の Gstreamers のインストール手順に従って、NDK バージョン (gstreamer-1.0-android-universal-1.18.3.tar.xz) に一致するバイナリをダウンロードし、それらをフォルダーに抽出することで、これを修正しようとしました。次に、環境変数が指す
GSTREAMER_ROOT_ANDROID=/home/user/Android/gstreamer
この環境変数を~/.projectにも~/.bashrcに追加し、それらのいずれかを入手してビルドして実行しようとしましたが、何も変わりませんでした。
次に、 local.propertiesとgradle.propertiesの両方に 同時に(そして一度に 1 つずつ)追加しようとしましたが、それでも同じ エラーが発生します。
gstreamer-java の github が提供する Javaの例は私のマシンで問題なく動作するため、システム全体のエラーではなく、ライブラリのロードに何らかの形で失敗する Android 環境固有のエラーのようです。おそらく、その環境変数を探す方法がわからないためです。
したがって、今の質問は次のとおりです。誰かが gst1-java-core を取得して、JNA を介して Android で動作するようにしましたか、またはこのライブラリのインポートに関して私が間違っている可能性があることに関して、誰かが私を正しい方向に向けることができますか? どんな助けでも大歓迎です。