想学学用C写写代码,发现Java能够经过JNI调用C,能够结合实现些花里胡哨的。遂下了DevC++,尝试一番,记下实践和注意点。java
目标:
Java中声明排序接口,将数组从Java传送到c,c排序后返回。经过替换dll切换排序方法。c++
主要步骤:数组
1 Java类声明native接口spa
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>引用到"jni.h",由于放到同一个目录下了。编译时遇到其余找不到.h引用的错误相似处理。
.c文件的具体实现:(include添加.h声明引用;参数定义变量名;添加实现;其中JNIEnv中保存了JNI传递类型值的处理方法;)code
#include "jni.h" #include "me_cai7n_jni_SortThem.h" #include <stdio.h> 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-1;j++) { //外循环一次,就排好一个数,并放在后面, //因此比较前面n-j-1个元素便可 for(i=0;i<n-j-1;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
疑惑:排序