想用c++代碼在Java中調用,以前也一直OK調用.so庫和jni接口,但不知道爲何在AS3.0上一直報標準庫找不到;html
還有一個變更就是AS2.2之後ndk編譯默認採用cmake了,這就致使之前的Android.mk和Application.mk文件寫法不行了;但爲了方便仍是使用了ndk-build方式(這塊官方文檔也是用的cmake,都沒有ndk-build教程了,哎~)。沒辦法,以前對這塊沒經驗,因此開始了填坑之旅。java
目前還只有一個問題,之後填了新坑再補充。android
首先要使用ndk-build
形式進行編譯cpp代碼,須要修改一下build.gradle
文件,如今新建c++項目都是用cmake了,因此咱們若是不用cmake
要用mdk-build
的話,須要改build.gradle
文件;直接貼代碼:c++
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目錄下的app
Android.mk以下:ide
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 <string>
找不到的問題沒有了,但願你們也能解決相同問題。gradle
在Android.mk
文件中添加APP_CFLAGS := -std=c++11
便可支持c++ 11函數,而後在APP_STL :=
中指定gnustl_static
能夠支持最多的函數庫。能夠查看官方文檔:C++ 庫支持ui
#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的flagspa
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') }