mac/window clion 交叉编译 android so踩坑之路.

之前直接提取ndk目录的g++,gcc发现出现勒很多很多问题, 也翻阅勒太多太多文章,终究是没找到解决方法,

今天无意中发现一篇文章.
https://my.oschina.net/gotax/blog/516861
虽然文章是4.8的演示,到了6.9有所变化,但是生成独立编译链的方式应该是没错了.

/Users/aaa/Library/Android/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --install-dir=~/Documents/dev/ndk_toolchain --force


#set(CMAKE_C_COMPILER gcc)
#指定需要CMAKE的最小版本
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_C_VISIBILITY_PRESET hidden)
#set (CMAKE_C_COMPILER /Users/aaa/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64)
#add_library(qssq666x SHARED main.c )
add_executable(qssq666x main.c)
cmake_minimum_required(VERSION 3.3)
project(demo)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")

# Android 5.0 以上需要在此处设置 PIE
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")

# 配置使用 NDK Standalone Toolchain 编译
set(NDK_STANDALONE_TOOLCHAIN /Users/aaa/Documents/dev/ndk_toolchain)
set(CMAKE_SYSTEM_NAME AndroidARM)
set(CMAKE_SYSTEM_VERSION 3)

set(CMAKE_C_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/arm-linux-androideabi-gcc)

set(CMAKE_CXX_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/arm-linux-androideabi-g++)
set(CMAKE_FIND_ROOT_PATH ${NDK_STANDALONE_TOOLCHAIN})

# 使用 NDK 提供的头文件
add_definitions("--sysroot=${NDK_STANDALONE_TOOLCHAIN}/sysroot")


aux_source_directory(src SOURCE_FILES)
add_executable(hello main.c)

# /Users/aaa/Library/Android/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --install-dir=~/Documents/dev/ndk_toolchain --force


image.png

设置界面


image.png

image.png

配置成功就有下图 可以运行,如果配置错误是看不到自己创建的cmake选项的.
编译成功就会有如下提示, 设置编译的目录可以自由设置,生存的文件是没有后缀名的.

image.png
./arm-linux-androideabi-gcc test.c -o hello

上面这个可以在4.4的夜神模拟器运行,但是5.0以上就是

error: only position independent executables (PIE) are supported.

错误

解决5.0以上Illegal Instruction


SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

解决5.0一下magic 7F45 yeshen
删除-pie但是删除之后 5.0以上就出错勒,mmp,我彻底崩溃勒,各位知道解决方法的求指点.

独立生成工具链的的几种方式

///Users/aaa/Library/Android/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --abis=armeabi-v7a --install-dir=~/Documents/dev/ndk_toolchain --platform=android-2

///Users/aaa/Library/Android/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh --abis=armeabi-v7a --install-dir=~/Documents/dev/ndk_toolchain --platform=android-21 --force

clion设置中可以设置make,cmake,g++ gcc, 调试器,也可以通过cmaketxt设置,
如果在cmake里面设置了-pie后果就是导致直接电脑测试模式也出现错误..

关于语法提示

根据本文章设置就可以解决.
目前依然没解决交叉编译问题,目前没解决的问题就是安卓系统全平台兼容.的so如何生成.
这种方式在5.0以上无法运行.

最简单的方式

/*

D:\env\android_sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>D:\en
v\android_sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-
androideabi-gcc.exe --sysroot E:\cross-c\ndk_toolchain\sysroot hello.c -o hello

D:\env\android_sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>
adb shell "/data/local/tmp/hello"
/system/bin/sh: /data/local/tmp/hello: can't execute: Permission denied
adb shell "chmod 777 /data/local/tmp/hello"
adb shell "/data/local/tmp/hello"
"/data/local/tmp/hello": error: only position independent executables (PIE) are supported.
arm-linux-androideabi-gcc.exe --help
*/

position independent executables (PIE) are supported.

image.png

arm-linux-androideabi-gcc.exe -pie --sysroot E:\cross-c\ndk_toolchain\sysroot hello.c -o hello
image.png

最终没有搞定的就是非命令行 也就window的cmake 集合nija编译,蛋疼了 估计要把cmake.xxxx.file整个改掉,
image.png

不自定义 cmake路径就无法执行,设置之后就导致这个问题。

cmake_minimum_required(VERSION 3.6)
#file(GLOB native_srcs "${CMAKE_SOURCE_DIR}/src/*.cpp")
include_directories(${CMAKE_SOURCE_DIR}/include)


set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
# Android 5.0 以上需要在此处设置 PIE
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
set(NDK_STANDALONE_TOOLCHAIN E:/cross-c/ndk_toolchain)
set(CMAKE_SYSTEM_NAME AndroidARM)
set(CMAKE_SYSTEM_VERSION 3)

#set(CMAKE_C_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/arm-linux-androideabi-gcc)
#set(CMAKE_CXX_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/arm-linux-androideabi-g++)
set(CMAKE_FIND_ROOT_PATH ${NDK_STANDALONE_TOOLCHAIN})
add_definitions("--sysroot=${NDK_STANDALONE_TOOLCHAIN}/sysroot")
include_directories(${CMAKE_SOURCE_DIR}/include)
aux_source_directory(src SOURCE_FILES)
message("dir:${SOURCE_FILES}")

#STATIC表示编译结果为静态库.a,如果想为动态库.so,可改为SHARED
#add_library(Add STATIC ${native_srcs}) # 如果同时添加 same name already exists.  The existing target is a static library created
add_executable(Add ${SOURCE_FILES})

牛逼的朋友求解决,我是不懂怎么搞了。

更多参考

https://blog.csdn.net/zhou12314/article/details/74275838
https://www.cnblogs.com/rickyk/p/3875334.html
https://www.cnblogs.com/myblesh/p/6639964.html
https://dmerej.info/blog/post/chuck-norris-part-6-android-cross-compilation/
https://android.googlesource.com/platform/external/android-cmake/+/upstream-master/android.toolchain.cmake
https://developer.android.com/ndk/guides/standalone_toolchain?hl=zh-cn

你可能感兴趣的:(mac/window clion 交叉编译 android so踩坑之路.)