Ошибка при загрузке .so файла в андроид-проекте из tenorflow - PullRequest
0 голосов
/ 25 мая 2018

Я хотел добавить поддержку тензорного потока в мой проект Android (моя собственная версия обнаружения объектов из демоверсии) и не хотел иметь дело с bazel или cmake для создания собственных библиотек, которые использует тензорный поток.Поэтому, как и было рекомендовано во многих выпусках, опубликованных в проекте tenorflow GitHub, я скачал самую последнюю успешную ночную сборку от Jenkins, которая содержит файл apk для тестирования демонстрации обнаружения объекта и файла .jar вместе с файлами .so из разных архитектур.

Поэтому я добавил предустановленные библиотеки 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заметил это:

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 Ответ

0 голосов
/ 29 мая 2018

Как и предполагалось, загрузки и включения файла .so в ваш собственный проект было недостаточно.Поскольку мы включаем предварительно скомпилированную версию библиотеки, нативные методы (в файлах .cpp) имеют имена пакетов из демонстрационной программы tenorflow на своих именах.Вот почему эта ошибка возникает из-за того, что наши собственные проекты называются по-разному.

  • Для решения этой проблемы вам необходимо переименовать пакет в org.tensorflow.demo и убедиться, что ObjectTracker.java находится под org.tensorflow.demo.tracking.

  • * 1013Вторым решением было бы изменение именования собственных методов в файлах .cpp в соответствии с именем вашего пакета, а затем перестройка файла .so с помощью bazel (там возникало много проблем, если кому-то это удастся, пожалуйста, укажите, как).
  • Я надеюсь, что команда tenorflow упомянет эту информацию, предложив загрузить и удалить предварительную версию, чтобы неопытные разработчики не тратили впустую ненужное время на эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...