您的位置:首页 > 移动开发 > Android开发

AndroidStudio上的第一个jni程序——NDK入门

2015-10-08 21:53 726 查看
之前在Eclipse上折磨过Jni编程,自从换了AndroidStudio之后,感觉写JNI变得很麻烦,今晚重新配置了下AndroidStudio,并安装了NDK包。

下面是在AndroidStudio上编写一个Jni小程序的过程,仅供新手参考和理清思路。

我的IDE版本及gradle版本


 


NDK 版本使用android-ndk-r10,这里提供国内下载链接:点击打开链接

点击下载后直接解压在自己指定的目录,这里我的目录是:E:\android-ndk-r10

我的AndroidSDK目录为:E:\AndroidStudio\Android-SDK

第一步,首先创建一个项目,命名为JNIdemo,在MainActivity中添加下述代码



第一个红框是添加静态代码块,作用是运行的时候动态调用名为“MyJni”的动态库

第二个红框是声明一个native方法,该方法需要后续我们在.c文件中实现

第三个红框则是我们利用一个TextView来显示我们调用native方法返回的字符串

同时绑定NDK,可以在”File“->”Project Structure“中添加ndk路径



在local.properties中可以如下设置



第二步,点击“Build”->“Make Project”进行编译,生成MainActivity.class文件,如下图



第三步,在AndroidStudio中打开终端,然后进入到该项目的app/src/main目录下,执行

javah -jni -classpath E:\AndroidStudio\Android-SDK\platfroms/android-23/android.jar;..\..\bulid\intermediates\classes\debug com.example.yummy.jnidemo.MainActivity



其中android.jar存放在AndroidSDK目录中,后者为class文件目录。

此时,在main目录下生成jni文件夹,里面含有com_example_yummy_jnidemo_MainActivity.h文件,其代码还有一个为实现的Nativie方法



第四步,在jni文件夹中,新建一个c文件,这里命名为main.c,写入下述内容

#include "com_example_yummy_jnidemo_MainActivity.h"
/*
* Class: com_jnimobile_www_myjnidemo_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_yummy_jnidemo_MainActivity_getStringFromNative
(JNIEnv * env, jobject obj){
return (*env)->NewStringUTF(env,"My first JNI demo!");
}这里函数的作用是返回一个字符串“my first JNI demo!“

在app目录下的build.gradle中添加ndk模块



然后重新编译一遍(”Build“->”ReBuild Priject“),在这里我遇到几个bug

bug1

Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

解决手段:在gradle.properties 文件里面添加 一句android.useDeprecatedNdk=true 后再重新编译

bug2

Error:Execution failed for task ':app:compileDebugNdk'.

> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'E:\android-ndk-r10\ndk-build.cmd'' finished with non-zero exit value 2

解决手段:在jni文件夹中在新建一个任意名称的.c空文件

bug3

java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String

解决手段:找不到本地Native方法,查看.c文件的方法名是否写正确了

第五步,运行程序



源程序代码:点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息