想用c++代碼在Java中調(diào)用,之前也一直O(jiān)K調(diào)用.so庫(kù)和jni接口雷则,但不知道為什么在AS3.0上一直報(bào)標(biāo)準(zhǔn)庫(kù)找不到仰楚;
還有一個(gè)變動(dòng)就是AS2.2以后ndk編譯默認(rèn)采用cmake了,這就導(dǎo)致以前的Android.mk和Application.mk文件寫法不行了垫挨;但為了方便還是使用了ndk-build方式(這塊官方文檔也是用的cmake跛溉,都沒有ndk-build教程了街夭,哎~)砰碴。沒辦法,之前對(duì)這塊沒經(jīng)驗(yàn)板丽,所以開始了填坑之旅呈枉。
目前還只有一個(gè)問題,以后填了新坑再補(bǔ)充埃碱。
問題:找不到類似string和std等標(biāo)準(zhǔn)庫(kù)函數(shù)
首先要使用ndk-build
形式進(jìn)行編譯cpp代碼猖辫,需要修改一下build.gradle
文件,現(xiàn)在新建c++項(xiàng)目都是用cmake了砚殿,所以我們?nèi)绻挥?code>cmake要用mdk-build
的話啃憎,需要改build.gradle
文件;直接貼代碼:
改動(dòng)一: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"
}
}
}
改動(dòng)二:Android.mk似炎、Application.mk
這兩個(gè)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
# 重點(diǎn)是這句話:
APP_STL := stlport_static
APP_CFLAGS := -O3 -Wall -pipe \
-ffast-math \
-fstrict-aliasing -Werror=strict-aliasing \
-Wno-psabi -Wa,--noexecstack \
-DANDROID -DNDEBUG
現(xiàn)在再clean項(xiàng)目辛萍,重新編譯項(xiàng)目,就發(fā)現(xiàn)類似#include <string>
找不到的問題沒有了羡藐,希望大家也能解決相同問題贩毕。
問題:找不到C++ 11標(biāo)準(zhǔn)庫(kù)shared_ptr
在Android.mk
文件中添加APP_CFLAGS := -std=c++11
即可支持c++ 11函數(shù),然后在APP_STL :=
中指定gnustl_static
可以支持最多的函數(shù)庫(kù)仆嗦』越祝可以查看官方文檔:C++ 庫(kù)支持
#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
問題:must be enabled with the -std=c++11 or -std=gnu++11 compiler options
解決辦法是在Android.mk
文件中加入支持c++11的flag
LOCAL_CFLAGS += -std=c++11
問題:More than one file was found with OS independent path
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')
}