本文将介绍在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文件夹:
4. 设置javah工具:
右键要生成头文件的java类文件,然后选择NDK Tools -> javah,这样在jni文件夹下就生成了相应的头文件。
5. 新建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的步骤相同。
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文件。
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>
运行结果
通过以上步骤后的运行结果如下: