bugfix> android > 投稿

私はAndroidプロジェクト(デモからのオブジェクト検出の独自バージョン)にテンソルフローサポートを追加したかったのですが、 bazel に対処したくありませんでしたまたは cmake tensorflowが使用するネイティブライブラリを構築します。そのため、tensorflow GitHubプロジェクトで投稿された多くの問題で推奨されているように、異なるアーキテクチャの.soファイルとともにオブジェクト検出デモおよび.jarファイルをテストするためのapkファイルを含むJenkinsから最新のナイトリービルドをダウンロードしました。

そこで、事前に構築されたライブラリ libtensorflow_demo.so を追加しましたおよび libtensorflow_inference.so (arm64-v8a、armeabi-v7a、x86、x86_64) そして、 libandroid_tensorflow_inference_java.jar libsディレクトリにファイルします。

私はこれらの行を私のgradleに追加しました:

lintOptions {
    abortOnError false
}
sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

私のproguard-rules-proにこれを追加しました:

-keepclasseswithmembers class * {
    native <methods>;
}

をロードする。そう 私が使用しているライブラリ:

System.loadLibrary("tensorflow_demo");

解凍しました.apk それがそこにあり、そこにあったかどうかを確認します。

私のlogcatからこれを見つけました:

I/TensorFlowInferenceInterface: Checking to see if TensorFlow native methods are already loaded
I/TensorFlowInferenceInterface: TensorFlow native methods not found, attempting to load via tensorflow_inference
I/TensorFlowInferenceInterface: Successfully loaded TensorFlow native methods (RunStats error may be ignored)
I/TensorFlowInferenceInterface: Model load took 123ms, TensorFlow version: 1.8.0-rc1
I/TensorFlowInferenceInterface: Successfully loaded model from 'file:///android_asset/frozen_inference_graph_stripped.pb'

しかし、アプリが起動するとクラッシュし、このエラーがスローされます:

java.lang.UnsatisfiedLinkError: No implementation found for void com.example.aboussaada.myapplication.tracking.ObjectTracker.initNative(int, int, boolean) (tried Java_com_example_aboussaada_myapplication_tracking_ObjectTracker_initNative and Java_com_example_aboussaada_myapplication_tracking_ObjectTracker_initNative__IIZ)
    at com.example.aboussaada.myapplication.tracking.ObjectTracker.initNative(Native Method)
    at com.example.aboussaada.myapplication.tracking.ObjectTracker.init(ObjectTracker.java:261)
    at com.example.aboussaada.myapplication.tracking.ObjectTracker.getInstance(ObjectTracker.java:224)
    at com.example.aboussaada.myapplication.tracking.MultiBoxTracker.onFrame(MultiBoxTracker.java:219)
    at com.example.aboussaada.myapplication.DetectorActivity.processImage(DetectorActivity.java:215)
    at com.example.aboussaada.myapplication.camera.CameraActivity.onPreviewFrame(CameraActivity.java:155)
    at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1153)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

ここで私が間違っているのは何ですか??どんな助けも大歓迎です。

回答 1 件
  • 提案されているように、 .so をダウンロードして含める  あなた自身のプロジェクトへのファイルは十分ではありませんでした。ライブラリのプリコンパイル済みバージョンを含めるため、ネイティブメソッド( .cpp  ファイル)には、名前にtensorflowデモのパッケージ名が含まれています。独自のプロジェクトパッケージの名前が異なるため、このエラーが発生します。

    この問題を解決するには、パッケージの名前を org.tensorflow.demo に変更する必要があります  そして、その ObjectTracker.java を確認してください   org.tensorflow.demo.tracking の下にある 。

    2番目の解決策は、ネイティブメソッドの名前を変更することです。 で .cpp  パッケージ名に従ってファイルを作成し、再構築します .so  バゼル付きファイル(誰かが管理する場合、そこに多くの問題に直面しました それを行うにはどのように言及してください)。

    経験の浅い開発者がこの問題に不必要な時間を無駄にしないように、事前購入版のダウンロードと削除を提案するときに、テンソルフローチームがこの情報に言及することを願っています。

あなたの答え