Я пытался добавить __android_log_print в исходный код Tensorflow Lite. Я использую следующую команду для создания библиотеки Tensorflow Lite (libtensorflowlite.jar и libtensorflowlite_jni.so).

bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/java:tensorflowlite \
--crosstool_top=//external:android/crosstool \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
--cpu=armeabi-v7a

Я использовал эти два файла (.jar и .so) для Приложение TFLiteCameraDemo, созданное с помощью Android Studio.

Однако когда я открыл приложение на своем устройстве Android (Android 7.1), оно показало следующие ошибки.

02-18 16:36:35.990 25543-25543/android.example.com.tflitecamerademo W/System.err: TensorFlowLite: failed to load native library: dlopen failed: cannot locate symbol "__android_log_print" referenced by "/data/app/android.example.com.tflitecamerademo-1/lib/arm/libtensorflowlite_jni.so"...
02-18 16:36:35.992 25543-25543/android.example.com.tflitecamerademo W/System.err: TensorFlowLite: failed to load native library: dlopen failed: cannot locate symbol "__android_log_print" referenced by "/data/app/android.example.com.tflitecamerademo-1/lib/arm/libtensorflowlite_jni.so"...
02-18 16:36:35.992 25543-25543/android.example.com.tflitecamerademo E/art: No implementation found for long org.tensorflow.lite.NativeInterpreterWrapper.createErrorReporter(int) (tried Java_org_tensorflow_lite_NativeInterpreterWrapper_createErrorReporter and Java_org_tensorflow_lite_NativeInterpreterWrapper_createErrorReporter__I)
02-18 16:36:35.992 25543-25543/android.example.com.tflitecamerademo D/AndroidRuntime: Shutting down VM

Кстати, я уже включил эти строки в свой build.gradle.

ndk {
        abiFilters "${cpuType}"
        ldLibs "log"
}

Я использую версию NDK r14b.

Есть ли решение этой проблемы?

0
Tsesar Rizqi 18 Фев 2018 в 12:53

1 ответ

Лучший ответ

ndk.ldLibs относится к устаревшему подключаемому модулю NDK. В наши дни мы используем другой синтаксис интеграции Android Studio.

В любом случае базель молча игнорирует это.

Вы можете передать -llog в bazel через флаг --linkopt:

bazel build -c opt --cxxopt='--std=c++11' --linkopt='-llog' …

Кстати, если я чего-то не упускаю, вы должны использовать --android_cpu вместо --cpu, но вы также можете его пропустить, потому что armeabi-v7a по умолчанию для --android_cpu.

1
Alex Cohn 18 Фев 2018 в 13:24