这篇文章主要介绍在AndroidStudio环境如何搭建JNI开发环境,并通过一个helloword的方式了解进行JNI开发的步骤。
开发编译环境
AndroidStudio 2.1.2SDK 23.0.3NDK 12.1.2977051NDK安装与配置
首先创建一个Android项目工程,File-->New-->New Project,一路下一步就好,最后finish创建完成项目.打开Project Structure,默认Android NDK location是没有的,这时候如果已经下载有了NDK,那你就可以直接选择下载好的NDK路径设置到输入框,否则点击download进行下载,下载完成后默认安装在sdk根目录,命名为ndk-bundle。 // 我的SDK地址为 D:\android-sdk. Project Structure 添加系统环境变量,新建变量名ANDROID_NDK_HOME,对应变量值为ndk根目录地址 ,如D:\android-sdk\ndk-bundle,然后将ANDROID_NDK_HOME添加到Path中去(%ANDROID_NDK_HOME%;),确定OK.至此,会在项目的local.properties文件下添加ndk的目录地址,如果没有自动添加,可以收到加上一行:ndk.dir=D\:\android-sdk\ndk-bundle,由于ndk版本和IDE的版本可能存在不一致性,所以编译时会检查ndk的过时性,这个时候如果报警了,可以在gradle.properties文件下添加一行:android.useDeprecatedNdk=true.到此,NDK的安装和配置就完成.HelloWord
在main下创建jni目录,该目录用于存放jni文件,主要包含c文件以及头文件等等。在MainActivity中创建native方法,遗憾的是当前版本AndroidStudio暂不支持c文件的连接和很好的根据提示自动创建c方法,所以只好手动添加模板。 Hint for Create Method 在jni目录下创建c文件hello.c,并创建MainActivity中的sayHello方法: c method impl 首先,添加头文件,类似java中的导包,这里首先必加的是jni.h,这是java与c/c++之间语言转换的核心文件,具体可以查看ndk目录下D:\android-sdk\ndk-bundle\platforms\android-23\arch-arm\usr\include\jni.h,另一个这里需要处理字符串,所以还需要包含string.h的头文件,同样可以在上面目录include中找到.然后,添加java中native方法的实现。jstring:返回值类型,Java_com_lzj_demojni_MainActivity_sayHello(JNIEnv *env, jobject jobj):实现的方法名,固定格式,Java_所要实现的方法名所在java类用下划线替代点的引用地址_方法名(JNI环境变量 env,JNI环境对象 jobj);其中env和jobj方法中可能用不到,但也必须申明,源码中是这样说明的,大概作用就是env作为了一个JNINativeInterface指针,是java与c/c++之间的一个功能环境变量中间桥梁。 JNIEnv 具体实现,(*env)->NewStringUTF(env, "Hello from JNI !"); 该行代码返回字符串Hello from JNI !,NewStringUTF方法可以查阅jni.h,可以看到具体的申明如下: NewStringUTF申明 NewStringUTF具体申明 Gradle配置,在build.gradle中加入你ndk moduleName ndk moduleName这里的moduleName是在代码中loadLibrary所填写的名称,也是生成so包的lib后面的名称,与jni目录下的c文件名称没有关系,
代码中调用,首先需要在静态代码块中loadLibrary,然后可以调用申明的native方法. use in code结束语
到这里,就完成了JNI编程的HelloWord,使用项目内部文件的方式进行JNI编程的基本步骤大致就是这样,下一篇文章将介绍如何编译成so包以及编译过程中的一些配置和常见的坑