jni c向java传递数组_记JNI实践(Java调用C数组排序)

想学学用C写写代码,发现Java可以通过JNI调用C,可以结合实现些花里胡哨的。遂下了DevC++,尝试一番,记下实践和注意点。

目标:

Java中声明排序接口,将数组从Java传送到c,c排序后返回。通过替换dll切换排序方法。

主要步骤:

新建Java类,声明Native接口;

自动生成JNI规范的对应C文件格式并实现;

Java中加载C编译的dll,调用C的实现;

1 Java类声明native接口

package me.cai7n.jni;

public class SortThem {

{

System.load("D:\\Workspace\\devc\\JNITEST.dll");

}

public native int[] sort(int[] arr);

public static void main(String[] args) {

int[] arr = new int[]{3,7,1,2,5,9};

int [] newArr = new SortThem().sort(arr);

System.out.println("Java: ");

for(int i : newArr)

{

System.out.print(" "+i);

}

System.out.println();

}

}

2 在CMD编译class,并生成.h声明文件

> javac SortThem.java

// 返回到src根目录

> javah -classpath . me.cai7n.jni.SortThem

3 新建devc++项目,选择dll类型,项目下添加.h文件.c文件jni.h文件和jni_md.h文件,修改.h中的引用到"jni.h",因为放到同一个目录下了。编译时遇到其他找不到.h引用的错误类似处理。

.c文件的具体实现:(include添加.h声明引用;参数定义变量名;添加实现;其中JNIEnv中保存了JNI传递类型值的处理方法;)

#include "jni.h"

#include "me_cai7n_jni_SortThem.h"

#include

JNIEXPORT jintArray JNICALL Java_me_cai7n_jni_SortThem_sort

(JNIEnv *a, jobject b, jintArray c)

{

jsize len = (*a)->GetArrayLength(a, c);

jint * data = (*a)->GetIntArrayElements(a, c, 0);

{

int i;

printf("c origin:");

for(i=0;i<6;i++) {

printf("%d ", data[i]);

}

printf("\n");

}

{

int n=6;

int i,j,temp;

//两个for循环,每次取出一个元素跟数组的其他元素比较

//将最大的元素排到最后。

for(j=0;j

//外循环一次,就排好一个数,并放在后面,

//所以比较前面n-j-1个元素即可

for(i=0;i

if(data[i]>data[i+1]) {

temp = data[i];

data[i] = data[i+1];

data[i+1] = temp;

}

}

}

}

{

int i=0;

for(i=0;i<6;i++) {

printf("%d ", data[i]);

}

printf("\n");

}

//根据int数组个数来创建一个jintArray

jintArray newIntArray = (*a)->NewIntArray(a, 6);

//把jint指针中的元素设置到jintArray对象中

(*a)->SetIntArrayRegion(a, newIntArray, 0, 6, data);

//返回jintArray对象

return newIntArray;

}

4 编译dll

5 运行java main

结果:

Java:

1 2 3 5 7 9

c origin:3 7 1 2 5 9

1 2 3 5 7 9

疑惑:

结果中c打印的在java返回打印之后打印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值