AS中ndk-build方式cpp问题集锦

想用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')
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,235评论 25 709
  • 向您的项目添加 C 和 C++ 代码 本文内容 下载 NDK 和构建工具 创建支持 C/C++ 的新项目 构建和运...
    会飞的大象_阅读 9,223评论 0 3
  • 文章摘要1、 c、c++项目的创建2、添加C、C++项目依赖库4、配置Gradle,编译lib so库 英文文献 ...
    Android那些事儿阅读 14,473评论 0 54
  • 和他,在一起三个月,分开两年。 两年后重新开始联系,仿佛中间过去的日子都像没发生过一样,没经历过那些彻夜难眠,浑浑...
    曲北阅读 1,513评论 0 0
  • 里烈 2017-12-30 六时书 6次 好种子 1、拔除自己傲慢自大的坏种子。并把这个拔除分享给我的朋友。以期帮...
    里喻棋阅读 1,103评论 0 0

友情链接更多精彩内容