以下是带有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可执行文件的原因吗?
答案 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的系统(或虚拟设备,使用模拟器时)。