JNI学习一(AndroidStudio NDK环境配置)

来源:互联网 发布:云服务器搭建sql serv 编辑:程序博客网 时间:2024/05/01 14:18

AndroidStudio版本:1.5.1

开篇不多说废话,本文主要分两部分:

  1. ndk的安装与配置
  2. jni在androidstudio的demo

ndk的安装与配置

1.下载ndk,打开File->Setting,然后搜索sdk,如图所示,在System Settings 目录下选择Android SDK,然后选择SDK Tools,勾选上NDK并下载,这里我已经安装好了
这里写图片描述

2.配置ndk目录,选择File->Project Structure,下载后的ndk放在sdk的目录下,选择即可
这里写图片描述

3.还需在gradle.properties文件中配置

android.useDeprecatedNdk=true

这是因为会产生一个错误
这里写图片描述

做了上面的三部后ndk就算配置好了。

JNI Demo

这个过程我概括为两步
1.编写相关代码
这个过程就是在Java代码中编写native方法,并在c代码中编写对应的方法
2.配置和引入库
在Moudule的build.gradle文件中配置库,并在java代码中引入库

详细如下:

1)新建一个Module,然后在MainActivity中编写如下代码
这里写图片描述
这时候会发现hello是红色的,这是因为编译器没能找到其对应的c/c++的实现

2)在src/main目录下,新建jni文件夹,并在其中新建一个c文件,比如这里我叫做hello.c
在其中写如下代码:
其中方法名是 Java_全类名_方法名,但包名之间的.改为下划线,如下Java_com_pngfi_jnidemo_MainActivity_hello

#include<jni.h>jstring Java_com_pngfi_jnidemo_MainActivity_hello(JNIEnv* env,jobject obj){    return (*(*env)).NewStringUTF(env,"hello jni");}

3)AndroidStudio简化了Android.mk文件的配置,会自动生成,我们只
在Module的build.gradle文件的defaultConfigs中配置如下

 defaultConfig {        applicationId "com.pngfi.jnidemo"        minSdkVersion 14        targetSdkVersion 23        versionCode 1        versionName "1.0"        ndk {            moduleName "JniDemo"            ldLibs "log", "z", "m"            abiFilters "armeabi", "armeabi-v7a", "x86"        }    }

其中moduleName 就是我们要引用的c库的名字,abiFilters 配置为不同类型的cpu产生对应的.so文件

4)在java代码中引入库,在MainActivity中加入如下代码

 static {        System.loadLibrary("JniDemo");    }

这是一个静态代码块,这里的JniDemo即上一步配置的库名字,到此我们只需在MainActivity中添加一个TextView并调用

textView.setText(hello());

点击运行即可,结果如下所示
这里写图片描述

关于其他
上面我们说到AndroidStudio中简化Android.mk文件的配置,其实它会帮我们生成对应的文件,编译Module,即可在如下图的目录查找到
这里写图片描述

另外,上面在c代码写方法名的时候是不是太麻烦了呢,javah命令可以帮助我们生成头文件,从而我们只需拷贝过来实现方法体即可。
如果你是的jdk版本>=1.7那么只需,如下在控制台中进入java目录下,执行javah 全类名 即可生成.h文件

这里写图片描述

我们把头文件剪切掉,放入jni文件夹。
在.c文件中引入头文件,把对应的方法声明拷入源文件,实现即可,如下

#include "com_pngfi_jnidemo_MainActivity.h"JNIEXPORT jstring Java_com_pngfi_jnidemo_MainActivity_hello(JNIEnv *env, jobject obj) {    return (*(*env)).NewStringUTF(env, "hello jni");}
0 0
原创粉丝点击