前言:教你通过JNI来排序,高效,快捷!
-------分割线------
java代码:
public static void main(String[] args) {
int[] jintArray = { 2, 01, 2, 6, 66, -1, -23, 23, 5, 1 };
TestJni tj = new TestJni();
// 利用c对java数组排序
tj.sortJavaIntArray(jintArray);
System.out.println("排序后");
for (int i : jintArray) {
System.out.print(i + " ");
}
System.out.println();
}
// 利用c对java数组排序
public native void sortJavaIntArray(int[] arg);
// 加载动态库
static {
System.loadLibrary("JNI");
}
c代码:
#include"com_fly_TestJni.h"
//比较器用于下面qsrot方法使用
int compare(const jint * a, const jint* b){
return (*a) - (*b);
}
JNIEXPORT void JNICALL Java_com_fly_TestJni_sortJavaIntArray
(JNIEnv *env, jobject job, jintArray jiarray){
jboolean flag;
//jint * (JNICALL *GetIntArrayElements)(JNIEnv *env, jintArray array, jboolean *isCopy);
//第一个参数
//第二个参数 java的int数组
//第三个参数 如果内部拷贝了数组返回 此传入参数的数值为true 反之
jint * mjintp = (*env)->GetIntArrayElements(env, jiarray, &flag);
printf("is copy array ?%d", flag);
int len = (*env)->GetArrayLength(env, jiarray);
//功 能: 使用快速排序例程进行排序
//函数指针void qsort(void*base, size_t num, size_t width, int(__cdecl*compare)(const void*, const void*));
//第一个参数 数组指针
//第二个参数 数组大小
//第三个参数 各元素的占用空间大小
//第四个参数 函数指针 用于比较两个数谁比较大
qsort(mjintp, len, sizeof(jint), compare);
//同步排序后的数组mjintp到java中的数组jiarray中,因为数组传入到c获取的时候是拷贝了一份 而不是直接引用
//释放数组的元素
//mode参数
//0,Java数组进行更新,并且释放C/C++数组
//JNI_ABORT,Java数组不进行更新,但是释放C/C++数组
//JNI_COMMIT,Java数组进行更新,不释放C/C++数组(函数执行完,数组还是会释放)
(*env)->ReleaseIntArrayElements(env, jiarray, mjintp, 0);
}
运行:
-------完---------