概述
今天闲来无事学习了一下JNI的使用,下面是我的学习随笔。
一、下载配置NDK
在AS中打开File->Project Structure界面,选择SDK Location,如下图 :
如果没有配置ndk的路径,点击下面按钮的安装即可。
打开项目的local.properties文件看到ndk.dir=D:\Android\sdk\ndk-bundle(我的NDK的安装目录)就证明ndk已经安装成功。
二、创建一个名为JNITest的项目
1)新建一个类名为JNIUtils
在本类中写你要添加到jni中的方法以及加载so文件
public static native String hiJNI();
public static native int Multiplication(inta,intb);
static{
System.loadLibrary("myFirstJNI");//加载so文件
}
2)生成class文件
点击Build->make Project,得到class文件,如下图:
3)生成.h文件
在AS的Terminal里面输入一下命令
进入class文件的目录下面
cd app/build/intermediates/classes/debug
对指定的类生成.h文件
javah -jni com.example.utils.JNIUtils
执行成功后会在原目录下生成.h文件,如下图:
以下是.h文件的代码:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_utils_JNIUtils */
#ifndef _Included_com_example_utils_JNIUtils
#define _Included_com_example_utils_JNIUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_utils_JNIUtils
* Method: hiJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_utils_JNIUtils_hiJNI
(JNIEnv *, jclass);
/*
* Class: com_example_utils_JNIUtils
* Method: Multiplication
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_utils_JNIUtils_Multiplication
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
4)编写.c文件
在src下面新建一个jni文件,把前面生成.h文件拷到该目录下面,然后新建一个.c文件,文件名由自己取。如下图:
在.c文件的头部引入.h文件,并把.h文件中的方法复制过来,并给其参数起变量名。以下是.c文件中的代码:
//
// 引入.h文件
#include <com_example_utils_JNIUtils.h>
/* Header for class com_example_utils_JNIUtils */
/*
* Class: com_example_utils_JNIUtils
* Method: hiJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_utils_JNIUtils_hiJNI
(JNIEnv *evn,jclass job){
return (*evn)->NewStringUTF(evn,"Hello World!");
}
/*
* Class: com_example_utils_JNIUtils
* Method: Multiplication
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_utils_JNIUtils_Multiplication
(JNIEnv *evn, jclass job, jint a, jint b){
return a*b;
}
5)配置生成so文件的一些基本信息
在app module目录下的build.gradle的defaultConfig中设置生成的so文件名
ndk{
moduleName "myFirstJNI" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。
}
在工程的gradle.properties中添加:
android.useDeprecatedNdk=true
6)运行到手机
在Activity中加入如下代码:
System.out.println("====="+JNIUtils.Multiplication(3,6));
运行到手机,查看控制台
并且可以看到生成的.so文件
三、新建一个Test项目用于测试前面生成的.so文件
如下图所示,把生成的so文件拷到对应的目录下面
把前面的工具类拷过来,在这儿要注意工具类的包名要与前面.c文件里的头文件里面一样,否则不能运行
这样so文件就可以使用了。