Android Studio + NDK

本文将介绍在Android Studio中使用NDK的一种简便的方法,先给出一些参考:

由于对Gradle的不熟悉,不想对build.gradle文件做过多的修改。那么可以通过先使用NDK编译so文件,然后再将so文件引入Android工程的步骤来配置Android Studio。

准备工作

-Android Studio 
-Android sdk 
-Android ndk

Android Studio使用的是稳定的1.4版本;ndk使用的是r10d版本。

操作步骤

1. 新建Android工程。

2. 申明native方法:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onCreate</span>(Bundle savedInstanceState) {
    ... ...
    TextView textView = (TextView) findViewById(R.id.textview);
    textView.setText(stringFromJNI());
    ... ...
}

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">native</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> String <span class="hljs-title" style="box-sizing: border-box;">stringFromJNI</span>();

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> {
    System.loadLibrary(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"hello"</span>);
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

3. 新建jni文件夹:

新建jni文件夹

4. 设置javah工具:

打开设置窗口 
设置javah工具 
右键要生成头文件的java类文件,然后选择NDK Tools -> javah,这样在jni文件夹下就生成了相应的头文件。

5. 新建C源文件

新建main.c

<code class="language-c hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include "jonesx_ndkexample_MainActivity.h"</span>

JNIEXPORT jstring JNICALL Java_jonesx_ndkexample_MainActivity_stringFromJNI(JNIEnv * env, jclass clazz)
{
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (*env)->NewStringUTF(env, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Hello from JNI!"</span>);
}
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

6. 新建Android.mk文件:

<code class="language-makefile hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-constant" style="box-sizing: border-box;">LOCAL_PATH</span> := <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$(call my-dir)</span>

include $(CLEAR_VARS)

<span class="hljs-constant" style="box-sizing: border-box;">LOCAL_SRC_FILES</span> := main.c
<span class="hljs-constant" style="box-sizing: border-box;">LOCAL_LDLIBS</span> += -llog
<span class="hljs-constant" style="box-sizing: border-box;">LOCAL_MODULE</span> := hello

include $(BUILD_SHARED_LIBRARY)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

7. 新建Application.mk文件:

<code class="language-makefile hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-constant" style="box-sizing: border-box;">APP_ABI</span> := armeabi
<span class="hljs-constant" style="box-sizing: border-box;">APP_PLATFORM</span> := android-16</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

8. 设置ndk-build工具:

和设置javah的步骤相同。 
ndk-build设置 
Parameters:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-constant" style="box-sizing: border-box;">NDK_PROJECT_PATH</span>=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ModuleFileDir</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$/</span>build/intermediates/ndk <span class="hljs-constant" style="box-sizing: border-box;">NDK_LIBS_OUT</span>=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ModuleFileDir</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$/</span>src/main/jniLibs <span class="hljs-constant" style="box-sizing: border-box;">NDK_APPLICATION_MK</span>=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ModuleFileDir</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$/</span>src/main/jni/<span class="hljs-constant" style="box-sizing: border-box;">Application</span>.mk <span class="hljs-constant" style="box-sizing: border-box;">APP_BUILD_SCRIPT</span>=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ModuleFileDir</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$/</span>src/main/jni/<span class="hljs-constant" style="box-sizing: border-box;">Android</span>.mk <span class="hljs-constant" style="box-sizing: border-box;">V</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

9. 生成so文件:

右键jni文件夹,选择NDK Tool -> ndk-build;这样会自动生成jniLibs目录,目录下有相应平台的so文件。 
生成的so文件

10. 修改gradle文件:

到现在还不能运行程序,因为会报错:

<code class="language-text hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Error:Execution failed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> task <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">':app:compileDebugNdk'</span>.
> Error: NDK integration is deprecated <span class="hljs-operator" style="box-sizing: border-box;">in</span> <span class="hljs-operator" style="box-sizing: border-box;">the</span> current plugin.  Consider trying <span class="hljs-operator" style="box-sizing: border-box;">the</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">new</span> experimental plugin.  For details, see <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">http</span>://tools.android.com/tech-docs/<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">new</span>-build-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">system</span>/gradle-experimental.  Set <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"android.useDeprecatedNdk=true"</span> <span class="hljs-operator" style="box-sizing: border-box;">in</span> gradle.properties <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">to</span> continue <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> <span class="hljs-operator" style="box-sizing: border-box;">the</span> current NDK integration.</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

还需要修改app\build.gradle文件,仅仅是添加一句:

<code class="language-gradle hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">android {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
    // add
    sourceSets.main.jni.srcDirs = []
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

运行结果

通过以上步骤后的运行结果如下: 
运行结果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值