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

相关文章

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 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

如何关闭Mac的Safari通知? 3招教你关闭Safari浏览器网站通知的技巧

《如何关闭Mac的Safari通知?3招教你关闭Safari浏览器网站通知的技巧》当我们在使用Mac电脑专注做一件事情的时候,总是会被一些消息推送通知所打扰,这时候,我们就希望关闭这些烦人的Mac通... Safari 浏览器的「通知」功能本意是为了方便用户及时获取最新资讯,但很容易被一些网站滥用,导致我们