【问题标题】:UnsatisfiedLinkError when running android project with tflite使用 tflite 运行 android 项目时出现 UnsatisfiedLinkError
【发布时间】:2023-02-15 15:50:47
【问题描述】:

我正在尝试在我的 C++ 项目中使用 libtensorflow.so,以便我可以在我的 android 包装器中使用它。我的项目是一个核心的 C++ 项目,但主要使用不同的 UI 绑定器 android NDK。我已经检查了 official build docs 并运行了这个命令:bazel build --config=elinux_aarch64 -c opt //tensorflow/lite/c:libtensorflowlite_c.so 没有问题。然后我从我从 github(我运行 bazel 的地方)获得的 tensorflow 源目录中获得了必要的包含目录,主要是 tensorflowflatbuffers

然后我将它添加到我的 android cmake 中,如下所示:


include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../third-party/include/tflite)

add_library(libtensorflowlite 
            SHARED 
            IMPORTED)

set_target_properties(
        libtensorflowlite 
        PROPERTIES 
        IMPORTED_LOCATION 
        ${CMAKE_CURRENT_SOURCE_DIR}/../../third-party/libs/tflite/arm64-v8a/libtensorflowlite.so
)
...
target_link_libraries(
...
#tflite
libtensorflowlite
...
)

当我运行我的项目时,我在 logcat 上得到了这个输出:

2023-02-13 11:37:01.222  3987-3987  ample.nerveblo          com.example.my_proj                W  Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (unsupported, reflection, allowed)
2023-02-13 11:37:01.223  3987-3987  ample.nerveblo          com.example.my_proj                W  Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (unsupported, reflection, allowed)
2023-02-13 11:37:01.229  3987-3987  AndroidRuntime          com.example.my_proj                D  Shutting down VM
2023-02-13 11:37:01.231  3987-3987  AndroidRuntime          com.example.my_proj                E  FATAL EXCEPTION: main
                                                                                                    Process: com.example.my_proj, PID: 3987
                                                                                                    java.lang.UnsatisfiedLinkError: dlopen failed: library "libm.so.6" not found: needed by /data/app/~~0XEVJKwYyglTdlVABYHPjw==/com.example.my_proj-8OVBEONU7K3bv0RuyroYKA==/base.apk!/lib/arm64-v8a/libtensorflowlite.so in namespace classloader-namespace
                                                                                                        at java.lang.Runtime.loadLibrary0(Runtime.java:1077)
                                                                                                        at java.lang.Runtime.loadLibrary0(Runtime.java:998)
                                                                                                        at java.lang.System.loadLibrary(System.java:1656)
                                                                                                        at com.example.my_proj.My_proj.<clinit>(My_proj.java:40)
                                                                                                        at com.example.my_proj.MainActivity.onCreate(MainActivity.java:76)
                                                                                                        at android.app.Activity.performCreate(Activity.java:8326)
                                                                                                        at android.app.Activity.performCreate(Activity.java:8306)
                                                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1347)
                                                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4212)
                                                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4403)
                                                                                                        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:104)
                                                                                                        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:2498)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:226)
                                                                                                        at android.os.Looper.loop(Looper.java:313)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8855)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
2023-02-13 11:37:01.246  3987-3987  Process                 com.example.My_proj                I  Sending signal. PID: 3987 SIG: 9
---------------------------- PROCESS ENDED (3987) for package com.example.my_proj ----------------------------
2023-02-13 11:37:01.268  1161-2253  WindowManager           system_server                        E  win=Window{a2940e9 u0 Splash Screen com.example.my_proj EXITING} destroySurfaces: appStopped=false win.mWindowRemovalAllowed=true win.mRemoveOnExit=true win.mViewVisibility=0 caller=com.android.server.wm.ActivityRecord.destroySurfaces:6283 com.android.server.wm.ActivityRecord.destroySurfaces:6264 com.android.server.wm.WindowState.onExitAnimationDone:6089 com.android.server.wm.ActivityRecord$$ExternalSyntheticLambda14.accept:2 java.util.ArrayList.forEach:1262 com.android.server.wm.ActivityRecord.onAnimationFinished:8340 com.android.server.wm.ActivityRecord.postApplyAnimation:6016 

【问题讨论】:

  • 您可能为 Android 编译了一个共享库,它有自己的依赖项 (libm.so),CMakeLists.txt 中没有。
  • @kiner_shah 我搜索了一下图书​​馆,它似乎是math.h,它显然可以包含在-lm 标志中,但添加它没有任何改变......
  • 确保在对 CMakeLists.txt 进行更改后清理并重建项目
  • @kiner_shah 没有变化

标签: java android c++ tensorflow android-ndk


【解决方案1】:

原因是我使用 --config=elinux_aarch64 标志而不是 --config=android_arm64 运行。使用该命令的 android 版本会导致更多问题,但我认为这是正确的方法。新问题主要是由于我试图在 linux amd 机器上交叉编译 aarch64 代码引起的,据我所知,tensorflow 还没有完全支持它。虽然我不太确定有人如何编译aarch64 机器...

如果有人有预编译的 aarch64 c++ tensorflow lite 库链接,我将不胜感激。

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多