1. 程式人生 > >AS中ndk-build方式cpp問題集錦

AS中ndk-build方式cpp問題集錦

都沒有 strings 添加 重新編譯 經驗 fun nts border for

想用c++代碼在Java中調用,之前也一直OK調用.so庫和jni接口,但不知道為什麽在AS3.0上一直報標準庫找不到;

還有一個變動就是AS2.2以後ndk編譯默認采用cmake了,這就導致以前的Android.mk和Application.mk文件寫法不行了;但為了方便還是使用了ndk-build方式(這塊官方文檔也是用的cmake,都沒有ndk-build教程了,哎~)。沒辦法,之前對這塊沒經驗,所以開始了填坑之旅。

目前還只有一個問題,以後填了新坑再補充。

問題:找不到類似string和std等標準庫函數

首先要使用ndk-build形式進行編譯cpp代碼,需要修改一下build.gradle文件,現在新建c++項目都是用cmake了,所以我們如果不用cmake

要用mdk-build的話,需要改build.gradle文件;直接貼代碼:

改動一: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"
}
}
}

改動二:Android.mk、Application.mk

這兩個makefile文件都是在jni目錄下的

技術分享圖片
image.png

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 <string>找不到的問題沒有了,希望大家也能解決相同問題。

問題:找不到C++ 11標準庫shared_ptr

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

問題: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‘)
}

AS中ndk-build方式cpp問題集錦