我的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。
或者,你可以将你的minSdkVersion
提升到16级。这些天几乎没有任何ICS设备,我怀疑剩下的很多只是用作闹钟和电视遥控器。