Android NDK > 18 未在 Fedora 36 中构建模块(与 elf32-i386 错误不兼容)

问题描述 投票:0回答:2

问题

我正在使用 Fedora 36(Linux 内核 5.19.12-200.fc36.x86_64)为移动应用程序框架构建 Android 模块。当我使用 NDK 18.1.5063045.

时一切正常

我测试了 Manjaro 22.0.3 并遇到了同样的问题。 OS X 运行良好!

一旦我使用更新的版本,例如 21.4.7075529,我就会出现以下错误:

[ERROR] [GRADLE]
[ERROR] [GRADLE] FAILURE: Build failed with an exception.
[ERROR] [GRADLE]
[ERROR] [GRADLE] * What went wrong:
[ERROR] [GRADLE] Execution failed for task ':module:buildNdkBuildRelease'.
[ERROR] [GRADLE] > Build command failed.
[ERROR] [GRADLE]   Error while executing process /home/user/tools/android-sdk/ndk/21.4.7075529/ndk-build with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/home/user/dev/ti.module/android/build/module/src/main/jni/Android.mk APP_ABI=armeabi-v7a NDK_ALL_ABIS=armeabi-v7a NDK_DEBUG=0 APP_PLATFORM=android-19 NDK_OUT=/home/user/dev/ti.module/android/build/module/build/intermediates/cxx/Release/18714c4q/obj NDK_LIBS_OUT=/home/user/dev/ti.module/android/build/module/build/intermediates/cxx/Release/18714c4q/lib APP_CPPFLAGS+=-std=c++14 APP_STL:=c++_shared -j20 --output-sync=none ti.module}
[ERROR] [GRADLE]   Android NDK: WARNING:/home/user/dev/ti.module/android/build/module/src/main/jni/Android.mk:ti.module: non-system libraries in linker flags: -lkroll-v8
[ERROR] [GRADLE]   Android NDK:     This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
[ERROR] [GRADLE]   Android NDK:     or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
[ERROR] [GRADLE]   Android NDK:     current module
[ERROR] [GRADLE]   [armeabi-v7a] Compile++ thumb: ti.module <= ti.module.CameraViewProxy.cpp
[ERROR] [GRADLE]   [armeabi-v7a] Compile++ thumb: ti.module <= ti.module.TiCameraxModule.cpp
[ERROR] [GRADLE]   [armeabi-v7a] Compile++ thumb: ti.module <= TiModuleBootstrap.cpp
[ERROR] [GRADLE]   [armeabi-v7a] SharedLibrary  : libti.module.so
[ERROR] [GRADLE]
[ERROR] [GRADLE]   ld: error: /home/user/tools/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/arm-linux-androideabi/19/crtbegin_so.o is incompatible with elf32-i386
[ERROR] [GRADLE]   ld: error: /home/user/dev/ti.module/android/build/module/build/intermediates/cxx/Release/18714c4q/obj/local/armeabi-v7a/objs/ti.module/__/__/__/build/ti-generated/jni/ti.module.CameraViewProxy.o is incompatible with elf32-i386
[ERROR] [GRADLE]   ld: error: /home/user/dev/ti.module/android/build/module/build/intermediates/cxx/Release/18714c4q/obj/local/armeabi-v7a/objs/ti.module/__/__/__/build/ti-generated/jni/ti.module.TiCameraxModule.o is incompatible with elf32-i386
[ERROR] [GRADLE]   ld: error: /home/user/dev/ti.module/android/build/module/build/intermediates/cxx/Release/18714c4q/obj/local/armeabi-v7a/objs/ti.module/__/__/__/build/ti-generated/jni/TiModuleBootstrap.o is incompatible with elf32-i386
[ERROR] [GRADLE]   ld: error: /home/user/dev/ti.module/android/build/module/build/intermediates/cxx/Release/18714c4q/obj/local/armeabi-v7a/libc++_shared.so is incompatible with elf32-i386
[ERROR] [GRADLE]   ld: error: /home/user/tools/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/arm-linux-androideabi/19/liblog.so is incompatible with elf32-i386
[ERROR] [GRADLE]   ld: error: /home/user/.titanium/mobilesdk/linux/11.1.1.GA/android/native/libs/armeabi-v7a/libkroll-v8.so is incompatible with elf32-i386
[ERROR] [GRADLE]   ld: error: /home/user/tools/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/arm-linux-androideabi/19/crtend_so.o is incompatible with elf32-i386
[ERROR] [GRADLE]   clang++: error: linker command failed with exit code 1 (use -v to see invocation)
[ERROR] [GRADLE]   make: *** [/home/user/tools/android-sdk/ndk/21.4.7075529/build/core/build-binary.mk:657: /home/user/dev/ti.module/android/build/module/build/intermediates/cxx/Release/18714c4q/obj/local/armeabi-v7a/libti.module.so] Fehler 1
[ERROR] [GRADLE]

ndk-build
命令及其参数是:

/home/user/tools/android-sdk/ndk/21.4.7075529/ndk-build
  NDK_PROJECT_PATH=null
  APP_BUILD_SCRIPT=/home/user/dev/ti.module/android/build/module/src/main/jni/Android.mk
  APP_ABI=armeabi-v7a
  NDK_ALL_ABIS=armeabi-v7a
  NDK_DEBUG=0
  APP_PLATFORM=android-19
  NDK_OUT=/home/user/dev/ti.module/android/build/module/build/intermediates/cxx/Release/18714c4q/obj
  NDK_LIBS_OUT=/home/user/dev/ti.module/android/build/module/build/intermediates/cxx/Release/18714c4q/lib
  APP_CPPFLAGS+=-std=c++14
  APP_STL:=c++_shared
  -j20
  --output-sync=none
  ti.module

Android.mk存储库中的源代码

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := ti.module

# Allow non-constant format strings in functions like printf(), sprintf(), etc.
LOCAL_DISABLE_FORMAT_STRING_CHECKS=true

TI_SDK_DIR = /home/user/.titanium/mobilesdk/linux/11.1.1.GA/android
LOCAL_CFLAGS := -g "-I$(TI_SDK_DIR)/native/include"
LOCAL_CFLAGS += -Wno-conversion-null -Wno-format-security -Wno-format -Wno-tautological-compare -Wno-unused-result -Wno-deprecated-register
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -llog -L$(TARGET_OUT) "-L$(TI_SDK_DIR)/native/libs/$(TARGET_ARCH_ABI)" -lkroll-v8

ABS_SRC_FILES := \
    $(wildcard $(LOCAL_PATH)/*.cpp) \
    $(wildcard $(LOCAL_PATH)/../../../build/ti-generated/jni/*.cpp)
LOCAL_SRC_FILES := $(patsubst $(LOCAL_PATH)/%,%,$(ABS_SRC_FILES))

include $(BUILD_SHARED_LIBRARY)

仓库中的Build.gradle文件

问题

为了使用 NDK > 18,我需要在我的 Fedora 机器上更改/安装任何内容,这样它就不会因此错误而停止:

这可能会导致错误的构建。尝试使用 LOCAL_STATIC_LIBRARIES 或 LOCAL_SHARED_LIBRARIES 来列出库依赖项...

当前解决方法

由于它适用于 NDK 18,我继续使用 NDK 18 并将 NDK 21 文件夹链接到我的 NDK 18 文件夹。

如何测试

由于它是移动框架的模块,您需要安装框架本身:

  • 安装 Titanium CLI
    sudo npm i -g titanium
  • 安装SDK
    ti sdk install latest
  • 克隆模块存储库,例如 https://github.com/tidev/ti.map
  • 进入 ti.map/android 文件夹并运行
    ti build -p android -b

我测试过的内容

我已更改要使用的 Android.mk 文件

LOCAL_SRC_FILES := $(TI_SDK_DIR)/native/libs/$(TARGET_ARCH_ABI)/libkroll-v8.so
include $(PREBUILT_SHARED_LIBRARY)

它构建模块,但它不会构建/包含带有

jni/arm*
文件的
jni/x86*
.so
文件夹。

linux gradle android-ndk clang fedora
2个回答
0
投票

事实证明,您不再需要安装

i686
库即可在 Linux 下使用 NDK/Android。我已经在新的 Linux 发行版中与其他开发人员一起对其进行了测试,并且他们工作正常。

因此,如果您想运行 NDK >18,则不要安装这些工具

for Ubuntu 13.10 and beyond     sudo apt-get install lib32z1 lib32ncurses5\
                                libstdc++6:i386
for Fedora                      su -c 'yum install libstdc++.i686\
                                ncurses-libs.i686 zlib.i686'

仅 NDK 需要 <=18!


-2
投票

我遇到了这个问题,通过更新

Android.mk
文件解决了。

因此,更新您的 Android.mk 文件以使用

LOCAL_STATIC_LIBRARIES
LOCAL_SHARED_LIBRARIES
,而不是直接在链接器标志中列出库。

此外,请查看您的 Fedora 计算机上是否安装了必要的依赖项。较新的 NDK 18.1 可能需要安装额外的库或软件包。

© www.soinside.com 2019 - 2024. All rights reserved.