java_jni详解_03

17 篇文章 0 订阅
直接看代码

public class IntArray{

public native int sumArray(int arr[]); //声明本地方法

public static void main(String[] args) {
IntArray p = new IntArray();
int arr[] = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
int sum = p.sumArray(arr);

System.out.println("sum = "+sum);
}

static{
//System.loadLibrary("helloworld"); // 加载库文件
System.load("/Users/zhaoshun/solibs/libIntArr.so");
}
}

/**
* JNI 对每种数据类型的数组都有对应的函数。
* 如下直接操作数组是错误的:
JNIEXPORT jint JNICALL
Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) {
int i,sum=0;
for(i=0;i<10;i++){
sum += arr[i];
}
}
JNI 中数组的基类为 jarray,其他如 jintArray 都继承自 jarray。

头文件内容
* Class: jni_sample_IntArray
* Method: sumArray
* Signature: ([I)I
JNIEXPORT jint JNICALL Java_jni_sample_IntArray_sumArray(JNIEnv *, jobject, jintArray);

运行结果:
sum = 45
*/



#include <jni.h>
#include <stdio.h>
#include "jni_sample_IntArray.h"
// printf 在stdio.h头文件中
JNIEXPORT jint JNICALL Java_jni_sample_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
jint buf[10];
jint i,sum = 0;
(*env)->GetIntArrayRegion(env,arr,0,10,buf); //把 arr 赋值给了 buf?
for (i = 0;i<10;i++) {
sum += buf[i];
}
return sum;
}

/**

使用 GetIntArrayRegion 拷贝数组内容到 buf 中,这里没有做越界异常检测, 因为知道数组有 10 个,参数 3 为待拷贝数组的起始位置,参数 4 为拷贝元素的个数。
JNI 支持 SetIntArrayRegion 允许重新设置数组一个区域的值,其他基本类型(boolean, short, 和float)也有对应的支持。
JNI 支持通过 Get/Release<Type>ArrayElemetns 返回 Java 数组的一个拷贝(实现优良的 VM,会返回指向 Java 数组的一个直接的指针,并标记该内存区域,不允许被 GC)。

JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
jint *carr;
jinti,sum=0;
carr = (*env)->GetIntArrayElements(env, arr, NULL);
if (carr == NULL) {
return 0;
}
for (i=0; i<10; i++) {
sum += carr[i];
}
(*env)->ReleaseIntArrayElements(env, arr, carr, 0);
return sum;
}
GetArrayLength 返回数组元素个数。
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值