android jni学习
参考
http://www.cnblogs.com/flyme/p/4431762.html
http://blog.csdn.net/sodino/article/details/41946607
Android的JNI开发有两种情况:一种是使用已经编译好的so动态库,别外一种是使用c/c++源码开发。下面分别介绍使用方法。
一、使用已经编译好的so
这种情况下,只要将.so文件放到相应的目录就可以了。在编译后,so文件会自动打包到apk中,在代码中直接loadLibrary就可以了。如下图

使用方法:
String libName = "helloNDK";//注意没有lib前缀和.so后缀
System.loadLibrary(libName);
二、使用C/C++源码
- 编写java源码

- 生成class文件
执行build--->make project,生成class文件,文件存放于下面的目录中。

- 生成.h头文件
在AS的terminal中使用javah命令生成头文件。我们要使用的是
javah -d <dir> -classpath <path>
-d:生成头文件存放的目录(这个目录如果事先没有,那么运行时会创建。
<dir> :-d选择的头文件存放的目录。
-classpath:从中加载类的路径命令。
<path>:是需要生成头文件的class文件的目录。
首先要cd到HelloNDK.java的文件夹main,如果不进行这个目录就运行javah时会提示找不到相关的类文件。
在切换到了main目录后,执行
javah -d jni -classpath ..\..\build\intermediates\classes\debug chuiyuan.lsj.androidjava.jni.HelloNDK
其中
jni:生成的头文件要保存的目录。
..\..\build\intermediates\classes\debug:class所在的目录。
最后一个是class文件名。
运行成功后,得到如下图

.h头文件出现了,它是自动生成的,不能进行改动。

- 编写C/C++源文件
函数名一定要从头文件中复制过来,以免出错。
得到的如下所示
//
// Created by lsj on 2015/9/18.
//
#include <jni.h>
#include <android/log.h>
#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif
//copy from header file
#ifndef _Included_chuiyuan_lsj_androidjava_jni_HelloNDK
#define _Included_chuiyuan_lsj_androidjava_jni_HelloNDK
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: chuiyuan_lsj_androidjava_jni_HelloNDK
* Method: syaHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_chuiyuan_lsj_androidjava_jni_HelloNDK_syaHello
(JNIEnv *env, jobject jObj) {
LOGE("log string from ndk");
return (*env)->NewStringUTF(env, "Hello from JNI");
}
#ifdef __cplusplus
}
#endif
#endif
- 配置app里面的build.gradle文件

如图,加入ndk的配置。
- 配置ndk的路径
要先下载,还是很大的。

- 最后生成 so文件

- 在Activity中测试jni


浙公网安备 33010602011771号