想學學用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
疑惑:排序