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

2024-05-04 11:32

本文主要是介绍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 helloD:\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/74275838https://www.cnblogs.com/rickyk/p/3875334.htmlhttps://www.cnblogs.com/myblesh/p/6639964.htmlhttps://dmerej.info/blog/post/chuck-norris-part-6-android-cross-compilation/https://android.googlesource.com/platform/external/android-cmake/+/upstream-master/android.toolchain.cmakehttps://developer.android.com/ndk/guides/standalone_toolchain?hl=zh-cn

这篇关于mac/window clion 交叉编译 android so踩坑之路.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959098

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方