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