无法运行NDK编译的x86可执行文件

时间:2014-09-17 04:42:42

标签: android opencv build android-ndk linker

以下是带有JNI组件的项目的Android.mk和Application.mk文件:

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)

Application.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可执行文件的原因吗?

2 个答案:

答案 0 :(得分:1)

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

如果您构建的可执行文件不使用任何特定于Android的API,您可以静态链接它,在这种情况下,您实际上可以在您的计算机上运行它 - 但是从列表中你链接的图书馆,我想情况并非如此。

答案 1 :(得分:0)

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