记JNI实践(Java调用C数组排序)

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

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

主要步骤:

  1. 新建Java类,声明Native接口;
  2. 自动生成JNI规范的对应C文件格式并实现;
  3. 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;jdata[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返回打印之后打印

你可能感兴趣的:(java,jni)