記JNI實踐(Java調用C數組排序)

想學學用C寫寫代碼,發現Java能夠經過JNI調用C,能夠結合實現些花裏胡哨的。遂下了DevC++,嘗試一番,記下實踐和注意點。java

目標:
Java中聲明排序接口,將數組從Java傳送到c,c排序後返回。經過替換dll切換排序方法。c++

主要步驟:數組

  1. 新建Java類,聲明Native接口;
  2. 自動生成JNI規範的對應C文件格式並實現;
  3. Java中加載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

疑惑:排序

  1. 結果中c打印的在java返回打印以後打印
相關文章
相關標籤/搜索