github上找的些项目,有些包含了ndk,但是项目较多比较老,在AS3.x版本上无法编译过(如标准库找不到),需要改动。
一个较大变动就是AS2.2以后ndk编译默认采用cmake了,这就导致以前的Android.mk和Application.mk文件写法不行了;但为了方便毕竟是github项目,只是想能够编译起来看看效果没必要大费周章的改动,所以还是使用了ndk-build方式(这块官方文档也是用的cmake,都没有ndk-build教程了)。没办法,之前对这块没经验,所以边网络找方案边尝试解决,开始了填坑之旅。
错误原因:APP_STL gnustl_shared 不再被ndk支持。
由于 Android OS 放弃GCC转向了 Clang 编译器, 所以 NDK 将移除GCC, 所以建议用Clang编译你的程序。
修改 Applicaiton.mk 中的相关配置
1. APP_STL := gnustl_static 改为 APP_STL := c++_static;
2.删除NDK_TOOLCHAIN or NDK_TOOLCHAIN_VERSION;
对于cmake编译:
1.删除 ANDROID_TOOLCHAIN
对于独立的toolchains
用clang/clang++ binaries 代替 gcc/g++.
首先要使用ndk-build
形式进行编译cpp代码,需要修改一下build.gradle
文件,现在新建c++项目都是用cmake了,所以我们如果不用cmake
要用mdk-build
的话,需要改build.gradle
文件;直接贴代码:
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.zhc.jnidemo"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
ndkBuild {
// Sets optional flags for the C compiler.
cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"
// Sets a flag to enable format macro constants for the C++ compiler.
cppFlags "-D__STDC_FORMAT_MACROS"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"
}
}
}
这两个makefile文件都是在jni目录下的
Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native
LOCAL_SRC_FILES := native-lib.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
Application.mk如下
#APP_OPTIM := release
APP_PLATFORM := android-15
APP_ABI := armeabi-v7a
NDK_TOOLCHAIN_VERSION=4.9
APP_PIE := false
# 重点是这句话:
APP_STL := stlport_static
APP_CFLAGS := -O3 -Wall -pipe \
-ffast-math \
-fstrict-aliasing -Werror=strict-aliasing \
-Wno-psabi -Wa,--noexecstack \
-DANDROID -DNDEBUG
现在再clean项目,重新编译项目,就发现类似#include
找不到的问题没有了,希望大家也能解决相同问题。
在Android.mk
文件中添加APP_CFLAGS := -std=c++11
即可支持c++ 11函数,然后在APP_STL :=
中指定gnustl_static
可以支持最多的函数库。可以查看官方文档:C++ 库支持
#APP_OPTIM := release
APP_PLATFORM := android-15
APP_ABI := armeabi-v7a
NDK_TOOLCHAIN_VERSION=4.9
APP_PIE := false
APP_STL := gnustl_static
APP_CFLAGS := -O3 -Wall -pipe \
-ffast-math \
-fstrict-aliasing -Werror=strict-aliasing \
-Wno-psabi -Wa,--noexecstack \
-DANDROID -DNDEBUG \
-std=c++11
解决办法是在Android.mk
文件中加入支持c++11的flag
LOCAL_CFLAGS += -std=c++11
Error:Execution failed for task ':app:transformNativeLibsWithMergeJniLibsForDebug'.
More than one file was found with OS independent path 'lib/armeabi-v7a/libnative-lib.so'
删除build.gradle
下面的:
// 删除一下代码
sourceSets.main {
jniLibs.srcDir('src/main/libs')
}