Android Studio 的 NDK 配置

 


 

I . 源码编译配置


 

1 . 源码编译配置 :

 

① 配置位置 : Module 级别的 build.gradle 中进行配置 ;

② 主要作用 : 主要作用是配置本工程中的 C/C++ 源码如何编译成动态库的 ;

③ 常用配置 : 一般配置将源码编译成哪几个 CPU 的指令集 ;

目前只支持 armeabi-v7a , arm64-v8a , x86 , x86-64 四种 CPU 指令集架构 ;

 

2 . 配置层级 : 在 android 下 defaultConfig 中配置的 externalNativeBuild 是配置 AS 中的 C/C++ 源码编译内容的 ;

 

注意区分配置 : externalNativeBuild 有两种类型的配置 , 一种在 defaultConfig 内部 , 一种在 defaultConfig 外部 ;

 

① defaultConfig 内部的 externalNativeBuild : 配置的是配置 AS 工程的 C/C++ 源文件编译参数

② defaultConfig 外部的 externalNativeBuild : 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径

 

2 . 配置脚本示例 ( 省略无关内容 ) :

<span style="color:#000000"><code class="language-java">apply plugin<span style="color:#99cc99">:</span> <span style="color:#99cc99">'com.android.application'</span>

android <span style="color:#999999">{</span>
    <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
    defaultConfig <span style="color:#999999">{</span>
        <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
        <span style="color:#999999">/*
            关于 CPU 指令集

            NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四种 CPU 架构
         */</span>
        
        <span style="color:#999999">// 配置 AS 工程中的 C/C++ 源文件的编译</span>
        <span style="color:#999999">//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数</span>
        <span style="color:#999999">//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径</span>
        externalNativeBuild <span style="color:#999999">{</span>
            cmake <span style="color:#999999">{</span>
                cppFlags <span style="color:#99cc99">""</span>

                <span style="color:#999999">//配置编译 C/C++ 源文件为哪几个 CPU 指令集的函数库 (arm , x86 等)</span>
                abiFilters <span style="color:#99cc99">"armeabi-v7a"</span> <span style="color:#999999">,</span> <span style="color:#99cc99">"arm64-v8a"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86_64"</span>
            <span style="color:#999999">}</span>
        <span style="color:#999999">}</span>
		<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
    <span style="color:#999999">}</span>
	<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
<span style="color:#999999">}</span>
</code></span>
  •  

II . 构建脚本配置


 

1 . 构建脚本配置 :

 

① 配置位置 : Module 级别的 build.gradle 中进行配置 ;

② 主要作用 : 主要作用是配置本工程中的 C/C++ 源码的构建脚本 ;

③ 常用配置 : 配置 cmake 或 ndkBuild 两种编译脚本中的一种 ( 只能二选一 ) ;

 

2 . cmake 配置 : 配置使用 CMake 编译 C/C++ 时的构建脚本 CMakeList.txt 路径 ;

 

① cmake 简介 : 使用 CMake 进行构建 , 构建脚本是 CMakeList.txt , 是 Android Studio 中新引入的 NDK 本地代码构建方式 ;

② 路径设置 : 路径的起点就是 build.gradle 文件所在的目录 , 即 app 目录 ;

② 配置示例 :

<span style="color:#000000"><code class="language-java">    externalNativeBuild <span style="color:#999999">{</span>
        cmake <span style="color:#999999">{</span>
            path <span style="color:#99cc99">"src/main/cpp/CMakeLists.txt"</span>
            version <span style="color:#99cc99">"3.10.2"</span>
        <span style="color:#999999">}</span>
</code></span>

3 . ndkBuild 配置 : 配置使用 ndkBuild 编译 C/C++ 时的构建脚本 Android.mk 路径 ;

 

① ndkBuild 简介 : 使用 ndkBuild 进行构建 , 构建脚本是 Android.mk , 是从 Eclipse + ADT 环境遗留下来的配置 NDK 编译方案 , 逐步被 CMake 替代 ;

② 路径设置 : 路径的起点就是 build.gradle 文件所在的目录 , 即 app 目录 ;

② 配置示例 :

<span style="color:#000000"><code class="language-java">    externalNativeBuild <span style="color:#999999">{</span>
        ndkBuild<span style="color:#999999">{</span>
            path <span style="color:#99cc99">"src/main/cpp/Android.mk"</span>
        <span style="color:#999999">}</span>
</code></span>

3 . 配置层级 : 在 android 与 defaultConfig 平级的 externalNativeBuild 是配置 AS 中的 C/C++ 源码编译构建脚本的 ;

 

注意区分配置 : externalNativeBuild 有两种类型的配置 , 一种在 defaultConfig 内部 , 一种在 defaultConfig 外部与之平级的配置 ;

 

① defaultConfig 内部的 externalNativeBuild : 配置的是配置 AS 工程的 C/C++ 源文件编译参数

② defaultConfig 外部的 externalNativeBuild : 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径

 

4 . 配置脚本示例 ( 省略无关内容 ) :

<span style="color:#000000"><code class="language-java">apply plugin<span style="color:#99cc99">:</span> <span style="color:#99cc99">'com.android.application'</span>

android <span style="color:#999999">{</span>
    <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
    defaultConfig <span style="color:#999999">{</span>
        <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
    <span style="color:#999999">}</span>
    <span style="color:#999999">// 配置 NDK 的编译脚本路径</span>
    <span style="color:#999999">// 编译脚本有两种 ① CMakeList.txt ② Android.mk</span>
    <span style="color:#999999">//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数</span>
    <span style="color:#999999">//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径</span>
    externalNativeBuild <span style="color:#999999">{</span>

        <span style="color:#999999">// 配置 CMake 构建脚本 CMakeLists.txt 脚本路径</span>
        <span style="color:#999999">//  使用该配置时 , 将 ndkBuild 配置注释掉</span>
        cmake <span style="color:#999999">{</span>
            path <span style="color:#99cc99">"src/main/cpp/CMakeLists.txt"</span>
            version <span style="color:#99cc99">"3.10.2"</span>
        <span style="color:#999999">}</span>

        <span style="color:#999999">// 配置 Android.mk 构建脚本路径</span>
        <span style="color:#999999">//  使用该配置时 , 将 cmake 配置注释掉</span>
        <span style="color:#999999">/*ndkBuild{
            path "src/main/cpp/Android.mk"
        }*/</span>
    <span style="color:#999999">}</span>
	<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
<span style="color:#999999">}</span>
<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
</code></span>
  •  

III . NDK 函数库打包配置


 

1 . 构建脚本配置 :

 

① 配置位置 : Module 级别的 build.gradle 中进行配置 ;

② 主要作用 : 主要作用是配置 APK 打包动态库的相关参数 ; 如在工程中编译的函数库 , 其提供了 arm, x86, mips 等指令集的动态库 , 那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置 ;

③ 常用配置 : 配置 cmake 或 ndkBuild 两种编译脚本中的一种 ( 只能二选一 ) ;

 

2 . 配置脚本示例 ( 省略无关内容 ) :

<span style="color:#000000"><code class="language-java">apply plugin<span style="color:#99cc99">:</span> <span style="color:#99cc99">'com.android.application'</span>

android <span style="color:#999999">{</span>
    <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
    defaultConfig <span style="color:#999999">{</span>
        <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
        <span style="color:#999999">/*
            关于 CPU 指令集

            NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四种 CPU 架构
         */</span>
        <span style="color:#999999">//配置 APK 打包 哪些动态库</span>
        <span style="color:#999999">//  示例 : 如在工程中编译的函数库 , 其提供了 arm, x86, mips 等指令集的动态库</span>
        <span style="color:#999999">//        那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置</span>
        ndk<span style="color:#999999">{</span>
            <span style="color:#999999">// 打包生成的 APK 文件指挥包含 ARM 指令集的动态库</span>
            abiFilters <span style="color:#99cc99">"armeabi-v7a"</span> <span style="color:#999999">,</span> <span style="color:#99cc99">"arm64-v8a"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86_64"</span>
        <span style="color:#999999">}</span>
		<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
    <span style="color:#999999">}</span>
	<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
<span style="color:#999999">}</span>
</code></span>
  •  

IV . Java 与 C 代码示例


 

1 . Java 代码 :

<span style="color:#000000"><code class="language-java"><span style="color:#cc99cc">package</span> kim<span style="color:#999999">.</span>hsl<span style="color:#999999">.</span>compile<span style="color:#999999">;</span>

<span style="color:#cc99cc">import</span> androidx<span style="color:#999999">.</span>appcompat<span style="color:#999999">.</span>app<span style="color:#999999">.</span>AppCompatActivity<span style="color:#999999">;</span>

<span style="color:#cc99cc">import</span> android<span style="color:#999999">.</span>os<span style="color:#999999">.</span>Bundle<span style="color:#999999">;</span>
<span style="color:#cc99cc">import</span> android<span style="color:#999999">.</span>widget<span style="color:#999999">.</span>TextView<span style="color:#999999">;</span>

<span style="color:#cc99cc">public</span> <span style="color:#cc99cc">class</span> MainActivity <span style="color:#cc99cc">extends</span> AppCompatActivity <span style="color:#999999">{</span>

    <span style="color:#cc99cc">static</span> <span style="color:#999999">{</span>
        <span style="color:#999999">//此处只能加载动态库 , 不能加载静态库</span>
        System<span style="color:#999999">.</span><span style="color:#6699cc">loadLibrary</span><span style="color:#999999">(</span><span style="color:#99cc99">"native-lib"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>

    <span style="color:#999999">@Override</span>
    <span style="color:#cc99cc">protected</span> <span style="color:#cc99cc">void</span> <span style="color:#6699cc">onCreate</span><span style="color:#999999">(</span>Bundle savedInstanceState<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        <span style="color:#cc99cc">super</span><span style="color:#999999">.</span><span style="color:#6699cc">onCreate</span><span style="color:#999999">(</span>savedInstanceState<span style="color:#999999">)</span><span style="color:#999999">;</span>
        <span style="color:#6699cc">setContentView</span><span style="color:#999999">(</span>R<span style="color:#999999">.</span>layout<span style="color:#999999">.</span>activity_main<span style="color:#999999">)</span><span style="color:#999999">;</span>

        TextView tv <span style="color:#99cc99">=</span> <span style="color:#6699cc">findViewById</span><span style="color:#999999">(</span>R<span style="color:#999999">.</span>id<span style="color:#999999">.</span>sample_text<span style="color:#999999">)</span><span style="color:#999999">;</span>
        tv<span style="color:#999999">.</span><span style="color:#6699cc">setText</span><span style="color:#999999">(</span><span style="color:#6699cc">stringFromJNI</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>

    <span style="color:#999999">}</span>

    <span style="color:#cc99cc">public</span> <span style="color:#cc99cc">native</span> String <span style="color:#6699cc">stringFromJNI</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>

<span style="color:#999999">}</span>

</code></span>
  •  

2 . C 代码 :

<span style="color:#000000"><code class="language-c"><span style="color:#f99157">#<span style="color:#cc99cc">include</span> <span style="color:#99cc99"><jni.h></span></span>
<span style="color:#f99157">#<span style="color:#cc99cc">include</span> <span style="color:#99cc99"><android/log.h></span></span>

JNIEXPORT jstring JNICALL
<span style="color:#6699cc">Java_kim_hsl_compile_MainActivity_stringFromJNI</span><span style="color:#999999">(</span>
        JNIEnv <span style="color:#99cc99">*</span>env<span style="color:#999999">,</span>
        jobject obj<span style="color:#999999">)</span> <span style="color:#999999">{</span>

    <span style="color:#6699cc">__android_log_print</span><span style="color:#999999">(</span>ANDROID_LOG_INFO<span style="color:#999999">,</span> <span style="color:#99cc99">"JNI_TAG"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"Hello from C"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>

    <span style="color:#cc99cc">return</span> <span style="color:#999999">(</span><span style="color:#99cc99">*</span>env<span style="color:#999999">)</span><span style="color:#99cc99">-></span><span style="color:#6699cc">NewStringUTF</span><span style="color:#999999">(</span>env<span style="color:#999999">,</span> <span style="color:#99cc99">"Hello from C"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
</code></span>

  •  

V . CMake 配置 ( CMakeLists.txt )


 

1 . CMakeLists.txt 配置示例 :

<span style="color:#000000"><code class="language-shell">
<span style="color:#999999"># 声明 CMake 版本</span>
cmake_minimum_required<span style="color:#999999">(</span>VERSION 3.4.1<span style="color:#999999">)</span>

<span style="color:#999999"># 添加库</span>
add_library<span style="color:#999999">(</span> <span style="color:#999999"># Sets the name of the library.</span>
        native-lib

        <span style="color:#999999"># Sets the library as a shared library.</span>
        SHARED

        <span style="color:#999999"># Provides a relative path to your source file(s).</span>
        native-lib.c<span style="color:#999999">)</span>


<span style="color:#999999"># 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib</span>
<span style="color:#999999">#   这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so</span>
<span style="color:#999999">#   不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库</span>
find_library<span style="color:#999999">(</span>
        log-lib

        log<span style="color:#999999">)</span>

<span style="color:#999999"># 链接库</span>
target_link_libraries<span style="color:#999999">(</span>
        native-lib

        <span style="color:#ee9900">${log-lib}</span><span style="color:#999999">)</span>
</code></span>
  •  

2 . 对应的 build.gradle 中的 NDK 配置 :

<span style="color:#000000"><code class="language-java">apply plugin<span style="color:#99cc99">:</span> <span style="color:#99cc99">'com.android.application'</span>

android <span style="color:#999999">{</span>
    <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
        <span style="color:#999999">/*
            关于 CPU 指令集

            NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四种 CPU 指令集架构
         */</span>

        <span style="color:#999999">// 配置 AS 工程中的 C/C++ 源文件的编译</span>
        <span style="color:#999999">//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数</span>
        <span style="color:#999999">//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径</span>
        externalNativeBuild <span style="color:#999999">{</span>
            cmake <span style="color:#999999">{</span>
                cppFlags <span style="color:#99cc99">""</span>

                <span style="color:#999999">//配置编译 C/C++ 源文件为哪几个 CPU 指令集的函数库 (arm , x86 等)</span>
                abiFilters <span style="color:#99cc99">"armeabi-v7a"</span> <span style="color:#999999">,</span> <span style="color:#99cc99">"arm64-v8a"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86_64"</span>
            <span style="color:#999999">}</span>
        <span style="color:#999999">}</span>


        <span style="color:#999999">//配置 APK 打包 哪些动态库</span>
        <span style="color:#999999">//  示例 : 如在工程中编译的函数库 , 其提供了 arm, x86, mips 等指令集的动态库</span>
        <span style="color:#999999">//        那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置</span>
        ndk<span style="color:#999999">{</span>
            <span style="color:#999999">// 打包生成的 APK 文件指挥包含 ARM 指令集的动态库</span>
            abiFilters <span style="color:#99cc99">"armeabi-v7a"</span> <span style="color:#999999">,</span> <span style="color:#99cc99">"arm64-v8a"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86_64"</span>
        <span style="color:#999999">}</span>


    <span style="color:#999999">}</span>

    <span style="color:#999999">// 配置 NDK 的编译脚本路径</span>
    <span style="color:#999999">// 编译脚本有两种 ① CMakeList.txt ② Android.mk</span>
    <span style="color:#999999">//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数</span>
    <span style="color:#999999">//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径</span>
    externalNativeBuild <span style="color:#999999">{</span>

        <span style="color:#999999">// 配置 CMake 构建脚本 CMakeLists.txt 脚本路径</span>
        <span style="color:#999999">//  使用该配置时 , 将 ndkBuild 配置注释掉</span>
        cmake <span style="color:#999999">{</span>
            path <span style="color:#99cc99">"src/main/cpp/CMakeLists.txt"</span>
            version <span style="color:#99cc99">"3.10.2"</span>
        <span style="color:#999999">}</span>

        <span style="color:#999999">// 配置 Android.mk 构建脚本路径</span>
        <span style="color:#999999">//  使用该配置时 , 将 cmake 配置注释掉</span>
        <span style="color:#999999">/*ndkBuild{
            path "src/main/cpp/Android.mk"
        }*/</span>
    <span style="color:#999999">}</span>
	<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
<span style="color:#999999">}</span>
<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
</code></span>

VI . ndkBuild 配置 ( Android.mk )


 

1 . Android.mk 配置示例 :

<span style="color:#000000"><code class="language-shell">
<span style="color:#999999"># my-dir 是 NDK 内置的函数 , 获取当前的目录路径</span>
<span style="color:#999999">#	在该案例中就是 Android.mk 文件所在的目录的绝对路径 , 工程根目录/app/src/main/cpp</span>
<span style="color:#999999">#	将该目录赋值给 LOCAL_PATH 变量</span>
<span style="color:#999999">#	所有的 Android.mk 的第一行配置都是该语句</span>

LOCAL_PATH :<span style="color:#99cc99">=</span> <span style="color:#ee9900"><span style="color:#ee9900">$(</span>call my-dir<span style="color:#ee9900">)</span></span>


<span style="color:#999999"># 打印 LOCAL_PATH 值</span>
<span style="color:#999999"># Build 打印内容 : LOCAL_PATH : Y:/002_WorkSpace/001_AS/005_NDK_Compile/app/src/main/cpp</span>
<span style="color:#999999"># 编译 APK 时会在 Build 中打印</span>

<span style="color:#ee9900"><span style="color:#ee9900">$(</span>info LOCAL_PATH <span style="color:#cc99cc">:</span> <span style="color:#999999">$(</span>LOCAL_PATH<span style="color:#ee9900">)</span></span><span style="color:#999999">)</span>


<span style="color:#999999"># 配置新的模块之前都要先清除 LOCAL_XXX 变量</span>
<span style="color:#999999">#	LOCAL_PATH 变量会保留</span>

include <span style="color:#ee9900"><span style="color:#ee9900">$(</span>CLEAR_VARS<span style="color:#ee9900">)</span></span>


<span style="color:#999999"># 配置动态库名称</span>
<span style="color:#999999"># 动态库命名规则 : 在 LOCAL_MODULE 基础上 , 添加 lib 前缀 和 .so 后缀</span>
<span style="color:#999999"># 生成动态库名称 : libnative-lib.so</span>

LOCAL_MODULE :<span style="color:#99cc99">=</span> native-lib


<span style="color:#999999"># 编译的源文件</span>

LOCAL_SRC_FILES :<span style="color:#99cc99">=</span> native-lib.c


<span style="color:#999999"># 配置构建的目标是动态库</span>

include <span style="color:#ee9900"><span style="color:#ee9900">$(</span>BUILD_SHARED_LIBRARY<span style="color:#ee9900">)</span></span>
</code></span>
  •  

2 . 对应的 build.gradle 中的 NDK 配置 :

<span style="color:#000000"><code class="language-java">apply plugin<span style="color:#99cc99">:</span> <span style="color:#99cc99">'com.android.application'</span>

android <span style="color:#999999">{</span>
    <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
        <span style="color:#999999">/*
            关于 CPU 指令集

            NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四种 CPU 指令集架构
         */</span>

        <span style="color:#999999">// 配置 AS 工程中的 C/C++ 源文件的编译</span>
        <span style="color:#999999">//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数</span>
        <span style="color:#999999">//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径</span>
        externalNativeBuild <span style="color:#999999">{</span>
            cmake <span style="color:#999999">{</span>
                cppFlags <span style="color:#99cc99">""</span>

                <span style="color:#999999">//配置编译 C/C++ 源文件为哪几个 CPU 指令集的函数库 (arm , x86 等)</span>
                abiFilters <span style="color:#99cc99">"armeabi-v7a"</span> <span style="color:#999999">,</span> <span style="color:#99cc99">"arm64-v8a"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86_64"</span>
            <span style="color:#999999">}</span>
        <span style="color:#999999">}</span>


        <span style="color:#999999">//配置 APK 打包 哪些动态库</span>
        <span style="color:#999999">//  示例 : 如在工程中编译的函数库 , 其提供了 arm, x86, mips 等指令集的动态库</span>
        <span style="color:#999999">//        那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置</span>
        ndk<span style="color:#999999">{</span>
            <span style="color:#999999">// 打包生成的 APK 文件指挥包含 ARM 指令集的动态库</span>
            abiFilters <span style="color:#99cc99">"armeabi-v7a"</span> <span style="color:#999999">,</span> <span style="color:#99cc99">"arm64-v8a"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86"</span><span style="color:#999999">,</span> <span style="color:#99cc99">"x86_64"</span>
        <span style="color:#999999">}</span>


    <span style="color:#999999">}</span>

    <span style="color:#999999">// 配置 NDK 的编译脚本路径</span>
    <span style="color:#999999">// 编译脚本有两种 ① CMakeList.txt ② Android.mk</span>
    <span style="color:#999999">//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数</span>
    <span style="color:#999999">//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径</span>
    externalNativeBuild <span style="color:#999999">{</span>

        <span style="color:#999999">// 配置 CMake 构建脚本 CMakeLists.txt 脚本路径</span>
        <span style="color:#999999">//  使用该配置时 , 将 ndkBuild 配置注释掉</span>
        <span style="color:#999999">/*cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }*/</span>

        <span style="color:#999999">// 配置 Android.mk 构建脚本路径</span>
        <span style="color:#999999">//  使用该配置时 , 将 cmake 配置注释掉</span>
        ndkBuild<span style="color:#999999">{</span>
            path <span style="color:#99cc99">"src/main/cpp/Android.mk"</span>
        <span style="color:#999999">}</span>
    <span style="color:#999999">}</span>
	<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
<span style="color:#999999">}</span>
<span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span></code></span>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 下载并安装NDK 首先,你需要从官网下载NDK。下载完成后,解压到你想要的目录下。 2. 配置NDK路径 打开Android Studio,选择File -> Project Structure,在左侧的菜单中选择SDK Location,然后在右侧的NDK location中输入你的NDK路径。 3. 创建jni目录 在你的项目根目录下创建一个名为jni的文件夹。 4. 创建C/C++文件 在jni目录下创建一个名为hello-jni.c的文件,并输入以下代码: #include <jni.h> #include <string.h> jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) { return (*env)->NewStringUTF(env, "Hello from JNI!"); } 5. 创建Android.mk文件 在jni目录下创建一个名为Android.mk的文件,并输入以下代码: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) 6. 创建Application.mk文件 在jni目录下创建一个名为Application.mk的文件,并输入以下代码: APP_ABI := all 7. 构建项目 在Android Studio中选择Build -> Make Project,然后等待构建完成。 8. 运行项目 在Android Studio中选择Run -> Run 'app',然后等待应用程序启动。 以上就是Android Studio配置NDK的步骤,希望对你有所帮助。 ### 回答2: Android Studio是谷歌官方推出的一款Android开发工具,使用Android Studio开发Android应用程序可以大大提高开发效率和开发质量。Android Studio支持使用NDK进行开发,NDK全称是Native Development Kit,用于编写或调整已有的C/C++代码库,将这些库集成至Android中,以提高应用程序的性能或实现一些不便于使用Java或Kotlin语言实现的功能。下面是关于Android Studio配置NDK的步骤: 1. 下载和安装Android Studio,打开Android Studio后,在“welcome to Android Studio”窗口中点击“configure”,选择“SDK Manager”。 2. 在SDK Manager窗口中,选择“SDK Tools”标签页,勾选“NDK”选项。在“SDK Platforms”和“SDK Tools”标签页中,选择“Show Package details”选项,选择需要的NDK版本,下载并安装。 3. 创建一个新项目或打开已有的项目。在打开的项目中,打开“File”选项,选择“Project Structure”选项卡,选择“SDK Location”,查看“Android NDK location”选项卡,如果NDK路径没有被设置,则点击“…”按钮选择NDK路径。然后,点击OK保存更改。 4. 结束上一步后,还需要在Gradle文件中设置NDK的路径。找到“build.gradle(Module:app)”文件,然后在其中添加以下代码: ```c++ android { … externalNativeBuild { cmake { // Specifies the directory where the CMakeLists.txt file is located. path "src/main/cpp/CMakeLists.txt" // Specifies the ABI configurations of your native // libraries Gradle should build and package with your APK. abiFilters "armeabi-v7a", "x86" // Passes optional arguments to CMake. arguments "-DANDROID_STL=c++_static" } } … } ``` 以上是Android Studio配置NDK的步骤,如按照上述步骤操作仍然有问题,建议参考官方NDK文档,自行查找解决方法。 ### 回答3: Android Studio是目前最流行的Android开发工具之一,而Android NDK则是一个能够将C、C++代码与Java代码结合使用的开发工具。在某些情况下,为了提高应用程序的性能,我们可能需要使用NDK开发Android应用程序。接下来,我们将详细介绍如何在Android Studio配置NDK。 1. 首先,您需要先下载并安装NDK。您可以从Google开发者网站下载最新版的NDK。 2. 打开Android Studio,然后单击“File”菜单中的“Project Structure”选项。 3. 在左侧的面板中,单击“SDK Location”选项卡。然后,在“Android NDK location”文本框中输入您的NDK路径,并单击“OK”。 4. 下一步是在您的应用程序中配置NDK。为此,请打开您的项目的“build.gradle”文件,并添加以下代码: ``` android { // ... defaultConfig { // ... ndk { // 设置你的 ndk 的路径 abiFilters 'armeabi-v7a', 'x86' } } } ``` 在“abiFilters”中添加您想要支持的CPU指令集。例如,如果您想要支持armeabi-v7a和x86指令集,您可以像上面的代码一样设置。 5. 最后,在您的项目中添加C或C++代码。如果您还没有C或C++代码,可以通过创建一个具有指定名称和位置的文件夹来添加代码。例如,在您的 Android 项目根目录下创建名为“jni”的文件夹: ``` $ cd /path/to/your-project $ mkdir jni ``` 在这个文件夹中,您可以添加您的C或C++代码。 6. 在Android Studio中构建您的项目并运行它,以确认您已成功配置NDK。 现在,您已经学会了在Android Studio配置NDK。这将使您能够使用C或C++代码来实现更高的应用性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值