上次的笔记中写的jni函数没有包含参数,jni的所有参数类型申明都放置在jni.h文件中。find / -name "jni.h",找到jni文件,打开会发现里面有很多结构和类型定义。
//jni中的基础类型
typedef unsigned char jboolean;
typedef unsigned short jchar;
typedef short jshort;
typedef float jfloat;
typedef double jdouble;
typedef jint jsize;
-----------------------------------------------------------------基础类型定义-----------------------------------------------------------------------
//jni中的对象类型
#ifdef __cplusplus
//c++对象定义
class _jobject {};
class _jclass : public _jobject {};
class _jthrowable : public _jobject {};
class _jstring : public _jobject {};
class _jarray : public _jobject {};
class _jbooleanArray : public _jarray {};
class _jbyteArray : public _jarray {};
class _jcharArray : public _jarray {};
class _jshortArray : public _jarray {};
class _jintArray : public _jarray {};
class _jlongArray : public _jarray {};
class _jfloatArray : public _jarray {};
class _jdoubleArray : public _jarray {};
class _jobjectArray : public _jarray {};
typedef _jobject *jobject;
typedef _jclass *jclass;
typedef _jthrowable *jthrowable;
typedef _jstring *jstring;
typedef _jarray *jarray;
typedef _jbooleanArray *jbooleanArray;
typedef _jbyteArray *jbyteArray;
typedef _jcharArray *jcharArray;
typedef _jshortArray *jshortArray;
typedef _jintArray *jintArray;
typedef _jlongArray *jlongArray;
typedef _jfloatArray *jfloatArray;
typedef _jdoubleArray *jdoubleArray;
typedef _jobjectArray *jobjectArray;
#else
//c对象定义
struct _jobject;
typedef struct _jobject *jobject;
typedef jobject jclass;
typedef jobject jthrowable;
typedef jobject jstring;
typedef jobject jarray;
typedef jarray jbooleanArray;
typedef jarray jbyteArray;
typedef jarray jcharArray;
typedef jarray jshortArray;
typedef jarray jintArray;
typedef jarray jlongArray;
typedef jarray jfloatArray;
typedef jarray jdoubleArray;
typedef jarray jobjectArray;
#endif
-----------------------------------------------------------------JNIEnv包含的函数-----------------------------------------------------------------------
方法太多就不贴了,也有俩个版本的函数定义,C++调用方式env->FindClass("java/lang/String"),c调用方式(*env)->FindClass(env, "java/lang/String")
带参数jni调用,计算数组的和
sum.h
#ifndef __SUM_H__
#define __SUM_H__
#include<jni.h>
#ifdef __cplusplus
extern "C"{
#endif
JNIEXPORT jint JNICALL Java_SumInt_sum(JNIEnv *env, jclass cls, jintArray arr);
#ifdef __cplusplus
}
#endif
#endif
sum.c
#include<jni.h>
#include"sum.h"
JNIEXPORT jint JNICALL Java_SumInt_sum(JNIEnv *env, jclass cls, jintArray arr){
int i;
int sum = 0 ;
//evn提供的获取数组长度
jsize len = (*env)->GetArrayLength(env, arr);
//获取数组元素
jint* body = (*env)->GetIntArrayElements(env, arr, 0 );
for(i = 0 ;i < len ; i++){
sum += body[i];
}
//最后释放本地方法中引用java数组的拷贝,防止内存泄露
(*env)->ReleaseIntArrayElements(env, arr, body, 0);
return sum;
}
SumInt.java
public class SumInt{
public native int sum(int[] array);
static{
System.loadLibrary("sum");
}
public static void main(String[] args){
int a[] = {1,2,3,4,5};
int r = new SumInt().sum(a);
System.out.println("sum : "+r);
}
}
通过JNIEnv这个指针,我们可以调用很多获取java传递过来数据的函数,这些函数基本上都定义在jni.h中。