【Android】Android Studio NDK 开发
<blockquote><p>个人博客:<br>
http://www.milovetingting.cn</p>
</blockquote>
<h1 id="android-studio-ndk-开发">Android Studio NDK 开发</h1>
<p>记录在Android Studio中NDK简单开发的步骤</p>
<p>用到的Android Studio版本为3.5。</p>
<h2 id="配置ndk">配置NDK</h2>
<h3 id="下载ndk">下载NDK</h3>
<p>一般在SDK下已经有自带的ndk文件夹,如sdk目录下的ndk-bundle文件夹。</p>
<p><img src="https://upload-images.jianshu.io/upload_images/3381990-d0a2f684b5478152.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p>如果没有,可以在SDK Manager中下载</p>
<p><img src="https://upload-images.jianshu.io/upload_images/3381990-059660bc224f3009.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p>下载LLDB、NDK两项</p>
<p>下载完成后,可以在sdk目录下看到ndk的文件夹</p>
<p><img src="https://upload-images.jianshu.io/upload_images/3381990-d0f2663eb668e243.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<h3 id="配置环境变量">配置环境变量</h3>
<p>我的电脑-属性-高级系统设置-环境变量</p>
<p>新建一个ANDROID_NDK变量,配置上ndk文件夹的位置(在这个文件夹下可以看ndk-build.cmd等文件)</p>
<p><img src="https://upload-images.jianshu.io/upload_images/3381990-9f091de5d858f0af.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p>然后将这个变量加入到path变量中</p>
<p><img src="https://upload-images.jianshu.io/upload_images/3381990-5311d2320dc6d13b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<h2 id="生成so库">生成SO库</h2>
<p>新建一个Hello.java文件,里面增加一个本地方法</p>
<pre><code class="language-java">public static native String hi();
</code></pre>
<p>执行Build-Make Project,在app\build\intermediates\javac\debug\classes目录下执行以下cmd命令生成头文件:</p>
<pre><code class="language-cmd">javah -jni com.wangyz.ndk.Hello
</code></pre>
<p>在该目录下,可以看到生成的com_wangyz_ndk_Hello.h文件。</p>
<p>在app/src/main/目录下新建jni目录,将生成的头文件复制到jni目录下。</p>
<p>在jni目录下新建com_wangyz_ndk_Hello.c文件,编写C语言实现代码:</p>
<pre><code class="language-c">#include "com_wangyz_ndk_Hello.h"
JNIEXPORT jstring JNICALL Java_com_wangyz_ndk_Hello_hi
(JNIEnv *env, jclass clazz){
return (*env)->NewStringUTF(env,"Hello");
}
</code></pre>
<p>在jni目录下新建Android.mk文件,内容如下:</p>
<pre><code class="language-mk">LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := com_wangyz_ndk_Hello.c
include $(BUILD_SHARED_LIBRARY)
</code></pre>
<p>在jni目录下新建Application.mk文件,内容如下:</p>
<pre><code class="language-mk">APP_ABI := all
</code></pre>
<p>在该目录下执行cmd命令:</p>
<pre><code class="language-cmd">ndk-build
</code></pre>
<p>执行后生成所需的so文件。</p>
<h2 id="引用so库">引用SO库</h2>
<p>在app/src/main目录下新建目录jniLibs,将对应的so复制到该目录下:</p>
<p><img src="https://upload-images.jianshu.io/upload_images/3381990-c6a976e49ce09508.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p>在Activity中引入:</p>
<pre><code class="language-java">static {
System.loadLibrary("Hello");
}
</code></pre>
<p>使用SO库中的方法</p>
<pre><code class="language-java">String hi = Hello.hi();
Toast.makeText(getApplicationContext(), hi, Toast.LENGTH_SHORT).show();
</code></pre>
<p>Android Studio中NDK的简单开发到此结束。</p>
</div>
<div id="MySignature" role="contentinfo">
Android代码搬运工一枚,欢迎留言讨论交流!
<br>
个人主页:http://www.milovetingting.cn<br><br>
来源:https://www.cnblogs.com/milovetingting/p/11468273.html 感谢楼主的分享!很详细的NDK开发教程,图文并茂,对于想学习NDK开发的新手来说非常友好。
顶一个!
看完教程有几点小想法想和楼主交流一下:
1. 现在Android Studio新版本对CMake的支持越来越好了,CMakeLists.txt用起来比Android.mk更方便一些,楼主有没有考虑写一篇关于CMake的教程?
2. 关于环境变量配置,其实也可以直接在local.properties里指定ndk路径,这样项目配置更灵活,不用每次都改系统环境变量。
3. 生成的SO库引用,除了手动复制到jniLibs,其实在build.gradle里配置sourceSets也可以直接指定so文件的路径,这样更方便版本管理。
个人主页:http://www.milovetingting.cn
期待博主更多关于NDK和JNI的实战文章!特别是涉及NDK调试、性能优化方面的内容。
已收藏博客地址! 以后会常来学习交流的~
强烈支持! 继续加油!
頁:
[1]