在jni中,或者android系统源代码中,最常用到的是通过JNI_OnLoad(...)方法,对方法进行注册,而不会像前面的测试demo,生成.h头文件,然后写一个.c的去实现.h中的方法,JNI_OnLoad的引入更加注重c++的使用,至少偏向c++,android系统源代码也是如此,到了下面往往是c++做了一个过渡,但是再进一步深入,最终还是c实现的,比如网络协议等,这一点可以看出实际上用到了c++面向对象编程对c做了封装,然后提供给java,而java也是面向对象的语言,对于衔接起了非常重要的作用.
在应用层加载so的时候,虚拟机首先回去/自动执行JNI_OnLoad(...),所以在这里注册所有的方法/函数就好了,加载到虚拟机中,等待上面调用!
下面验证一下,新建一个android工程如下:
<1> : 新建android工程,目录树如下:
<2> : 下面的文件内容如下:
DurianOnLoad.java :
/**
* @Title: DurianOnLoad.java
* @Package com.durian.jnionload.lib
* @Description: TODO
* @author zhibao.liu from durian organization
* @date 2015-12-25 下午04:46:13
* @version V1.0
*/
package com.durian.jnionload.lib;
/**
* @ClassName: DurianOnLoad
* @Description: TODO
* @author zhibao.liu Freelancer
* @email warden_sprite@foxmail.com
* @date 2015-12-25 下午04:46:13
*
*/
public class DurianOnLoad {
public native float getDurianLibVersion();
public native int DurianAdd(int a,int b);
public native int DurianEqual(int a);
public native float DurianEqualF(float a,float b);
static{
System.loadLibrary("durianjni");
}
}
durianUtils.h
#include <jni.h>
/* Header for class com_durian_jnienv_lib_DurianJni */
#ifndef _Included_com_durian_jnienv_lib_DurianUtils
#define _Included_com_durian_jnienv_lib_DurianUtils
#ifdef __cplusplus
extern "C" {
#endif
#include<string.h>
#include<stdlib.h>
#include <android/log.h>
#define LOG_TAG "durian"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#defi