詳細なコールJavaプログラミング言語C

年生のJavaおよびデータ構造は、カリキュラムの設計に必要な、怠惰になりたいので、ちょっと、2つの科目のみをライン上で、この1つのカリキュラムのデザインを使用し、ソート可視化プログラム、JavaとC言語混合プログラミングを行う
これらのクラスの良いを決定するために、最初のJavaこの方法は、C言語で書かれたものを使用することで、プラスネイティブ

class NativeSort
{
	//冒泡排序
    public native int[][] BubbleSort(int[] unsortedArray,int v);
    //快速排序
    public native int[][] QuickSort(int[] unsortedArray,int v);
    //插入排序
    public native int[][] InsertionSort(int[] unsortedArray,int v);
    //选择排序
    public native int[][] SelectionSort(int[] unsortedArray,int v);
    //希尔排序
    public native int[][] ShellSort(int[] unsortedArray,int v);
    public native int[][] MergeSort(int[] unsortedArray,int v);
}

そして、その後、このファイルは、早期のjavahファイルをコンパイルされ、コンパイルコンソールへのjavac、NativeSort.classがこのファイルを見つけ、これに注意を払うには、の.classファイルのパッケージ名を追加しなければならない、または見つけることができない
彼らは、外出先の内部対このヘッダファイルを取ったので、ヘッダファイルを取得しますDLLプロジェクト、64に設定マネージャに注意を払う、と32ビットJDK右で今誰を構築

ここに画像を挿入説明
jni.h中、あなたがライン上にインストールされているJavaを見つけるjni_md行くそこに文法構造とCで記述されたデータ型であることと、あなたの体の正常な機能は同じではないだろうので、これら二つは、必須です、我々はこれらの2つのヘッダファイルに依存する必要がありますデータ構造は、最も厄介なエリア内で混合プログラミングの同じタイプではありません
、関数名の内側に、新しいnativeSort.cを作成し、リスト上で見つけるためにjavahがコンパイルヘッダファイルに直接アクセスし、関数名のヘッダファイルを決定するために変更することができません

JNIEXPORT jobjectArray JNICALL Java_c_1dll_1sort_NativeSort_BubbleSort
(JNIEnv *env, jobject object, jintArray unsortedArray, jint v) 

JNIEnvの* ENV、jオブジェクトのオブジェクト・パラメータが必要であり、それ以降の変換パラメータ・タイプのENV
jintArray unsortedArray、JINT vは整数配列であり、Iは、カスタムパラメータ整形
次のように特定のコードを

jobjectArray result;
	jclass intArrCls = env->FindClass("[I");//JNI通过它来确定引用的类型的,I代表整数,[代表数组
	result = env->NewObjectArray(10000, intArrCls, NULL);

	jint *carr;//将jintArray转化成能使用的int[]类型
	carr = env->GetIntArrayElements(unsortedArray, false);

	jint temp = 0;
	jint isSorted;
	jint a=0;//循环二维数组
	for (int i = 0; i <100; i++) {
		
		isSorted = 1;  //假设剩下的元素已经排序好了
		for (int j = 0; j < 100 - i; j++) {
			if (v == 0)//升序
			{
				
				if (carr[j] < carr[j + 1]) {
					temp = carr[j];
					carr[j] = carr[j + 1];
					carr[j + 1] = temp;
					isSorted = 0;  //一旦需要交换数组元素,就说明剩下的元素没有排序好
					jintArray iarr = env->NewIntArray(100);//为一维int数组iarr分配空间

					env->SetIntArrayRegion(iarr, 0, 100, carr);//为iarr赋值
					env->SetObjectArrayElement(result, a, iarr);
					env->DeleteLocalRef(iarr);
					a++;
				}
			}
			else {//降序
				if (carr[j] > carr[j + 1]) {
					temp = carr[j];
					carr[j] = carr[j + 1];
					carr[j + 1] = temp;
					isSorted = 0;  //一旦需要交换数组元素,就说明剩下的元素没有排序好
					jintArray iarr = env->NewIntArray(100);//为一维int数组iarr分配空间

					env->SetIntArrayRegion(iarr, 0, 100, carr);//为iarr赋值
					env->SetObjectArrayElement(result, a, iarr);
					env->DeleteLocalRef(iarr);
					a++;
				}
			}
			
		}
		if (isSorted) break; //如果没有发生交换,说明剩下的元素已经排序好了

		
	}
	return result;
}

低速接続に関する上記のコメントと合わせて、あなたは割り当ては、特定の構文JDKのヘッダファイルを使用する必要があります作成するために、いくつかのデータタイプを見つけることができる
何を見つけるために、x64のフォルダにこのようルックで生成しますどこか下のbinファイルのJavaプロジェクトへのdllファイル、また、ライン上のパスを変更することができ
、次のようにJavaの呼び出しコードを

try {
			System.loadLibrary("NativeSort");//加载由C编译器生成的DLL文件。 
			NativeSort nSort= new NativeSort();
			int[][] a=nSort.InsertionSort(unsortedArray, v);
			return a;
		}
		catch (Exception e) {
			// TODO: handle exception
			System.out.print(e); 
		}

ここに画像を挿入説明
呼び出しが失敗した表情dllファイルのパスがまだ設定されています

下にそのようなプロセスは、主要な問題少ないコーディングすることができるが、各タイプのデータがそれほど多くの情報が変更された非常に良いではありません

住人は、お互いを励まします!

公開された43元の記事 ウォンの賞賛8 ビュー3917

おすすめ

転載: blog.csdn.net/MaYang_/article/details/103729744