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
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