jni笔记2

上次的笔记中写的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中。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值