Cross Compile libdsm(C Library)for Android

时间:2016-12-27 09:33:59

标签: android android-ndk

我正在尝试交叉编译一个名为Libdsm的C库。我想生成.so文件,以便我可以在其上编写一个jni包装器,以便在Android项目中进一步使用。我使用以下命令来构建它,如库的作者所解释的那样:

  

$> ./bootstrap

     

$> ./configure --prefix = / your / prefix

     

$>使

     

$> make install#maybe

构建之后,我意识到生成的二进制文件因为体系结构的不同而无法使用android。 我应该如何更改配置,以便生成的二进制文件兼容在我的Android项目中使用?

P.S。:我已经完成了几个使用NDK& amp;的通用教程。也许是一个生成.so文件的工具链,但我对这些文件并不十分熟悉,当我尝试这样做时,我经常会遇到错误。

2 个答案:

答案 0 :(得分:0)

最好的办法是使用NDK的独立工具链:https://developer.android.com/ndk/guides/standalone_toolchain.html

答案 1 :(得分:0)

我已成功使用makefile构建Android SO(因为“官方”NDK构建过程真的很糟糕)

您只需要在您的工具链文件夹中使用正确的编译工具 ANDROID_NDK文件夹(例如c:/android/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/)。并在/ sources / cxx-stl /中的相应include文件和toolchain lib文件夹中的libs中添加include路径。

这就是我的makefile的样子:

ifndef $(NDK_PLATFORM)
    NDK_PLATFORM = android-19
endif

ifndef $(GCC_VERSION)
    GCC_VERSION = 4.9
endif

ifndef $(GCC_TARGET)
    GCC_TARGET=arm-linux-androideabi
endif

ifndef $(ARCH)
    ARCH=arch-arm
endif

SYS := $(shell gcc -dumpmachine)
ifndef $(TOOLS_PLATFORM)
ifneq (, $(findstring x86_64-apple-darwin, $(SYS)))
    TOOLS_PLATFORM=darwin-x86_64
else
ifneq (, $(findstring x86_64-redhat-linux, $(SYS)))
    TOOLS_PLATFORM=linux-x86_64
endif
    TOOLS_PLATFORM=windows-x86_64
endif
endif

ifndef $(ANDROID_PLATFORM)
    ANDROID_PLATFORM=armeabi-v7a
endif

TOOLCHAIN=$(GCC_TARGET)-$(GCC_VERSION)
CC_EXECUTABLE=$(GCC_TARGET)-gcc
CPP_EXECUTABLE=$(GCC_TARGET)-g++
SYS_ROOT=$(ANDROID_NDK)/platforms/$(NDK_PLATFORM)/$(ARCH)
PATH_LINK=$(SYS_ROOT)/usr/lib
TOOLCHAIN_BIN_FOLDER=$(ANDROID_NDK)/toolchains/$(TOOLCHAIN)/prebuilt/$(TOOLS_PLATFORM)/bin
TOOLCHAIN_LIB_FOLDER=$(ANDROID_NDK)/toolchains/$(TOOLCHAIN)/prebuilt/$(TOOLS_PLATFORM)/lib

STDC_FOLDER=$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/$(GCC_VERSION)
CC="$(TOOLCHAIN_BIN_FOLDER)/$(CPP_EXECUTABLE)"

NDK_INCLUDE_PATHS = -I "$(SYS_ROOT)/usr/include"
NDK_INCLUDE_PATHS += -I "$(STDC_FOLDER)/include" 
NDK_INCLUDE_PATHS += -I "$(STDC_FOLDER)/libs/$(ANDROID_PLATFORM)/include" 
NDK_INCLUDE_PATHS += -I "$(STDC_FOLDER)/include/backward" 
NDK_INCLUDE_PATHS += -I "$(TOOLCHAIN_LIB_FOLDER)/gcc/$(GCC_TARGET)/$(GCC_VERSION)/include"

NDK_LIB_PATHS = -Wl,-L"$(PATH_LINK)"
NDK_LIB_PATHS += -Wl,-L"$(TOOLCHAIN_LIB_FOLDER)/gcc/$(GCC_TARGET)/$(GCC_VERSION)/armv7-a"
NDK_LIB_PATHS += -Wl,-L"$(STDC_FOLDER)/libs/$(ANDROID_PLATFORM)/thumb" 



DEFS=-DANDROID -DDISABLE_OFURL -DTARGET_ANDROID -DBOOST_SYSTEM_NO_DEPRECATED
COPTS = -Werror --sysroot="$(SYS_ROOT)" -gdwarf-2 -Wall -fno-strict-aliasing -mthumb -fno-omit-frame-pointer -fexceptions -mfloat-abi=softfp -fstack-protector -fpic -fno-short-enums -frtti -std=c++1y -x c++ 

LDOPTS = -Wl,-rpath-link="$(PATH_LINK)" -Wl,--no-undefined --sysroot="$(SYS_ROOT)" -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack

ifeq ($(MODE),DEBUG)   
COPTS += -O0 -g3 -D_DEBUG -DDEBUG
else
COPTS += -O3 -s -DNDEBUG
LDOPTS += -O3 -s
endif

除此之外你的makefile应该可以正常工作