2016-12-27 115 views
0

我想交叉編譯一個名爲Libdsm的C庫。我想生成.so文件,以便我可以在其上編寫一個jni包裝器,以便在Android項目中進一步使用。我用下面的命令來構建它由庫的作者解釋說:針對Android的交叉編譯libdsm(C庫)

$> ./bootstrap

$>的./configure --prefix = /您/前綴

$ >使

$> make install的#也許

建設之後,我意識到,生成的二進制文件不會因迪與Android合作在體系結構方面。 我應該如何更改配置,使生成的二進制文件兼容以用於我的Android項目?

PS:我已經通過一對夫婦使用NDK &可能的工具鏈生成的.so文件,通用教程走了,但我不是很熟悉這些,當我嘗試這樣做,我經常收到錯誤。

回答

0

我已經成功地使用的makefile構建Android SOS(爲「官方」 NDK生成過程是真正可怕的)

你只需要使用的工具鏈文件夾的正確編譯工具在 ANDROID_NDK文件夾(如C:/android/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/)。並將include路徑添加到/ sources/cxx-stl /中相應的包含文件以及toolchain lib文件夾中的libs。

這是我的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應該能正常運行