【问题标题】:Unable to run x86 executable compiled by NDK无法运行 NDK 编译的 x86 可执行文件
【发布时间】:2014-09-17 04:42:41
【问题描述】:

这是我的项目的 Android.mk 和 Application.mk 文件,其中包含一个 JNI 组件:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

include $(OPENCV_ANDROID_ROOT)/sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := exeFileName
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := file1.cpp file2.cpp file3.cpp
LOCAL_LDLIBS    += -llog -landroid -lEGL -lGLESv1_CM

include $(BUILD_EXECUTABLE)

应用程序.mk

  APP_STL := gnustl_static
  APP_CPPFLAGS := -frtti -fexceptions
  APP_ABI := all
  APP_MODULES := exeFileName

ndk-build 为所有架构成功构建可执行文件。但是当我尝试在 ./libs/x86/ 中运行可执行文件时,该可执行文件在我的 64 位 linux 桌面上无法识别有效。确切的错误是“bash:./libs/x86/exeFileName:没有这样的文件或目录” 我使用 ldd 检查了可执行文件是否缺少指向库的链接,这是输出:

linux-gate.so.1 =>  (0xf77b1000)
liblog.so => not found
libdl.so => not found
libz.so => not found
libandroid.so => not found
libEGL.so => not found
libGLESv1_CM.so => not found
libc.so => not found
libm.so => not found
libstdc++.so => not found

但是,如果我从手机上的 ./libs/armeabi/ 推送可执行文件并从设备上的 shell 执行它,它就可以工作。

您能帮我找出无法运行 x86 可执行文件的原因吗?

【问题讨论】:

  • 您应该使用 x86 设备或模拟器; Android 可执行文件不会在桌面计算机上运行即使内核非常接近。
  • 谢谢,亚历克斯!我将更改构建脚本以在 linux 环境中使用 g++。

标签: android opencv build android-ndk linker


【解决方案1】:

为 Android 构建的可执行文件需要在您的计算机上不可用的动态库,正如您在 ldd 中发现的那样。此外,ldd 没有显示的是,可执行文件还需要一个不同于普通 linux 系统上可用的运行时动态链接器(/system/bin/linker 而不是例如/lib/ld-linux.so.2)。此外,如果您只是从 Android 设备复制列出的库,不要指望能够运行二进制文件 - 它们还会有进一步的要求。无论如何,最终您最终都会拥有几乎完整的 Android 环境。

如果您要构建一个不使用任何 android 特定 API 的可执行文件,您将能够静态链接它,在这种情况下,您实际上可以在您的计算机上运行它 - 但从列表中您要链接到的库,我想情况并非如此。

【讨论】:

  • 这意味着,使用 ndk-build 我无法获得可以在我的常规 linux 系统上运行的可执行文件。我必须更改为 g++ 才能为桌面环境构建可执行文件。对吗?
【解决方案2】:

您根本无法在常规 Linux 桌面上运行 Android x86 可执行文件。仅在基于 Android/x86 的系统(或虚拟设备,使用模拟器时)上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2019-11-15
    • 1970-01-01
    • 2021-06-16
    • 2015-03-27
    相关资源
    最近更新 更多