ndk-build .so不兼容的目标(预建的共享库)

时间:2015-05-05 12:35:00

标签: android android-ndk

 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := slabhidtouart
LOCAL_SRC_FILES := libslabhidtouart.so
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS)

LOCAL_MODULE    := TestJNI
### Add all source file names to be included in lib separated by a whitespace
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := TestJNI.cpp 
LOCAL_SHARED_LIBRARIES := slabhidtouart
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/jni
include $(BUILD_SHARED_LIBRARY)

使用ndk构建编译给出错误

testjni1//obj/local/armebai/libslabhidtouart.so: incompatible target
谁能告诉我哪里出错了

修改:using readelf -d i got this

Dynamic section at offset 0x1fd90 contains 28 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libusb-1.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000e (SONAME)             Library soname: [libslabhidtouart.so.1]

某些库根据需要标记了这意味着什么。

实际上我是这类项目的新手,所以我对我需要的东西以及接下来要做的事情感到困惑。现在我有一些东西,比如我正在使用为另一个cpu(x86_64)构建的库,我需要ARM的库,感谢你们,你们让我清楚

3 个答案:

答案 0 :(得分:5)

此参考:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := slabhidtouart
LOCAL_SRC_FILES := libslabhidtouart.so
include $(PREBUILT_SHARED_LIBRARY) 

表示您在编译模块时要使用libslabhidtouart.so。但.so文件是仅与一个特定的cpu架构/操作系统兼容的二进制文件。

您获得的错误意味着ndk-build在为不兼容的目标编译模块时尝试使用.so文件。

Android支持多种cpu架构(armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips,mips64)。您可以使用 Application.mk 中的 APP_ABI 变量选择要支持的文件。如果将其设置为all,ndk-build将尝试使用您为每个体系结构引用的.so文件,但这不起作用。

您的.so文件必须已针对Android平台进行编译,并且您需要为您支持的每个体系结构提供不同版本的.so文件。您可以为正确的.so文件提供动态引用,例如LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libslabhidtouart.so,以便在编译armeabi-v7a时在armeabi-v7a文件夹下查找.so文件,在x86下搜索x86等等。

当然你需要提供这些.so文件。如果您无法获得所有受支持体系结构的.so文件,则必须将APP_ABI限制为您拥有的.so文件的体系结构。您可以使用readelf确定已编译.so文件的体系结构。

编辑:您的最新评论确切地说您的.so文件是针对x86编译的,但我也怀疑它是针对标准Linux,而不是Android。您可以使用readelf -d检查lib依赖项。

答案 1 :(得分:0)

预构建的库应该使用相应的NDK standlone工具链构建,例如“arm-linux-androideabi-4.9”,“x86-4.9”......

你可以在文件夹/ toochains /

中找到它们

答案 2 :(得分:-2)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := slabhidtouart
LOCAL_SRC_FILES := libslabhidtouart.so
include $(PREBUILT_SHARED_LIBRARY) 

使用ndk构建进行编译会给出错误:

  

testjni1 // obj / local / armebai / libslabhidtouart.so:目标不兼容

chmod a+x solve it