不飞则已,一飞冲天;不鸣则已,一鸣惊人。这篇文章主要讲述在Android Studio 3.0中构建PIE和非PIE可执行文件相关的知识,希望能为你提供帮助。
我的android项目应该生成本机可执行文件作为构建的一部分,并支持API 14(Android 4.0)中的所有设备。问题是4.0仅支持非派可执行文件,而Android>
5.0仅支持派对可执行文件。这意味着我应该生成饼和非饼可执行文件,我找不到任何合适的方法来实现我当前的设置(Android Studio 3.0,NDK r16,llvm-5.0)。我在我的CMakeLists.txt文件中使用了Android Studio 2.3和NDK r15的以下解决方法:
add_executable(hello
src/main/cpp/main.cpp
)add_executable(hello-nonpie
src/main/cpp/main.cpp
)target_compile_definitions(hello
PRIVATE
-DANDROID_PIE=ON
)target_compile_definitions(hello-nonpie
PRIVATE
-DANDROID_PIE=OFF
)
这个hack在AS 3.0和NDK r16上不再起作用 - 只有当我的
minSdkVersion
被设置为14时它才产生非饼干二进制文件,或者只有当我明确地将-DANDROID_PIE=ON
参数传递给cmake时才产生饼干二进制文件。我发现在一个版本中嵌入饼图和非饼图版本的唯一方法是创建两个相同的Android库模块,在
-DANDROID_PIE
文件中使用不同的build.gradle
参数值,并使app模块依赖于它们。它确实有效,但是配置和构建时间减慢了两倍以上我现在只有三个项目(app本身和两个模块)。任何关于解决这个问题的想法都将不胜感激。答案我回答了我们的mailing list,但包括完整性:
这个hack在AS 3.0和NDK r16上不再起作用 - 它只在我的我真的不明白你的方法是如何运作的。minSdkVersion
被设置为14时产生非PIE二进制文件,或者只有在我明确地将-DANDROID_PIE=ON
参数传递给CMake时才产生PIE二进制文件。
-DANDROID_PIE
作为预处理器定义没有任何改变。您想要做的是为with-pie可执行文件设置-fPIE
cflag和-pie
ldflag。【在Android Studio 3.0中构建PIE和非PIE可执行文件】或者,你可以将你的
minSdkVersion
提升到16级。这些天几乎没有任何ICS设备,我怀疑剩下的很多只是用作闹钟和电视遥控器。推荐阅读
- Android Studio NDK链接器错误未定义引用'cv :: _ OutputArray :: _ OutputArray(cv :: Mat&)'
- JNI_OnLoad通常用于Android NDK吗()
- Android Studio 3.0.1在Android.mk中注释掉行
- Android Studio 3.0.1忽略Application.mk中的APP_ABI()
- Android NDK将参数传递给本机方法
- 有没有办法在Android NDK上使用__int128_t()
- 从.aar文件Android中提取代码
- TravisCI中的NDK,CMake和Android
- 如何使用cmake和Android NDK在C ++中加载线程支持