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

ndk-build .so incompatible target (prebuilt shared library)

 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 build 编译给出错误

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 的库,谢谢你们,你们让我明白了

预建库应使用相应的 NDK 独立工具链构建,例如 "arm-linux-androideabi-4.9"、"x86-4.9"...

您可以在文件夹 /toolchains/

中找到它们

此引用:

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

意味着你想在编译你的模块时使用libslabhidtouart.so。但是 .so 文件是只与一个特定的 cpu-architecture/OS.

兼容的二进制文件

您遇到的错误意味着 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 文件,例如 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 依赖项。

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

使用 ndk build 编译给出错误:

testjni1//obj/local/armebai/libslabhidtouart.so: incompatible target

chmod a+x solve it