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

标签 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 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 库,谢谢你们,你让我清楚

最佳答案

这个引用:

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文件,例如LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libslabhidtouart.so因此,在为 armeabi-v7a 编译时,它会在 armeabi-v7a 文件夹下查找您的 .so 文件,在 x86 下为 x86 编译等。

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

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

关于android - ndk-build .so 不兼容的目标(预建共享库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053103/

相关文章:

android - 用于简化后台线程创建和 UI 线程同步的类

java - 从 C 到 Java 的类型转换

android - 如何在android中使用单个drawable文件夹

java - OnCompleteListener 和 CompletionListener 之间有什么区别?

Android NDK 标准头文件编译错误

Android NDK C++ 相机2 API : ACameraManager_getCameraIdList return 0 cameras

android - 在android ndk中链接so文件

android - Bitbucket 管道 : No toolchains found in the NDK toolchains folder for ABI with prefix: aarch64-linux-android

java - RxJava 对列表执行操作并返回可观察对象

javascript - 谷歌云消息 (fake_message_id)