第一步:Java代码
注意包名,生成头文件的时候要与自己的包名和类名相吻合。
然后生成class, 使用下列命令行
javac com/javajni/jni/Test_2_DSA.java
package com.javajni.jni; public class Test_2_DSA { static { System.loadLibrary( "Test_2_ASD"); } /** * @param args */ private static native String[][] getStringArrays(); public static void main(String[] args) { System.out.println( "二维数组中的数组元素如下:"); // TODO Auto-generated method stub String array[][] = getStringArrays(); for ( int i = 0; i < array.length; i++) { // 利用双重循环将二维数组中的元素依次输出 for ( int j = 0; j < array[i].length; j++) { System.out.print( " " + array[i][j]); } System.out.println(); } } }
在com 的上一级目录里面运行下列命令行
javah -d ../JNI -classpath . -jni com.javajni.jni.Test_2_DSA
头文件内容如下,如果你吧头文件jni.h放在你的项目目录里面,那么引用的时候应该用引号而不是尖括号。
/* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class com_javajni_jni_Test_2_DSA */ #ifndef _Included_com_javajni_jni_Test_2_DSA #define _Included_com_javajni_jni_Test_2_DSA #ifdef __cplusplus extern "C" { #endif /* * Class: com_javajni_jni_Test_2_DSA * Method: getStringArrays * Signature: ()[[Ljava/lang/String; */ JNIEXPORT jobjectArray JNICALL Java_com_javajni_jni_Test_12_1DSA_getStringArrays (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
第三步:C语言源文件
#include "com_javajni_jni_Test_2_DSA.h" static jobjectArray make_row(JNIEnv *env, jsize count, const char* elements[]) { /*此子程序功能为做行*/ /*得到一个新的字符串对象,通过找到Java中String的父类*/ jclass stringClass = (*env)->FindClass(env, "java/lang/String"); jobjectArray row = (*env)->NewObjectArray(env, count, stringClass, 0); jsize i; for (i = 0; i < count; ++i) { /*向每一行里面填充字符串*/ (*env)->SetObjectArrayElement(env, row, i, (*env)->NewStringUTF(env, elements[i])); } /*返回一个二维数组的一行,此时为一个一维的数组,因为只有一列*/ return row; } JNIEXPORT jobjectArray JNICALL Java_com_javajni_jni_Test_12_1DSA_getStringArrays(JNIEnv *env, jclass klass) { /*假定我们有两行四列的字符串数组*/ const jsize NumColumns = 4; /*设置列数*/ const jsize NumRows = 2; /*设置行数*/ /*举例第一行的字符串*/ const char* beatles[] = { "John", "Paul", "George", "Ringo" }; /*得到第一行字符串数组*/ jobjectArray jbeatles = make_row(env, NumColumns, beatles); /*举例第二行的字符串*/ const char* turtles[] = { "Leonardo", "Raphael", "Michaelangelo", "Donatello" }; /*得到第一行字符串数组*/ jobjectArray jturtles = make_row(env, NumColumns, turtles); /*因为我们是C语言 所以调用JNI函数的时候要加一个env的参数 放在最前面*/ jobjectArray rows = (*env)->NewObjectArray(env, NumRows, (*env)->GetObjectClass(env, jbeatles), 0); /*向的字符串数组填入第一行字符串*/ (*env)->SetObjectArrayElement(env, rows, 0, jbeatles); /*向的字符串数组填入第一行字符串*/ (*env)->SetObjectArrayElement(env, rows, 1, jturtles); /*返回一个字符串数组*/ return rows; }
第四步:编译运行
因为本人用的是Visual Studio来生成的所以没有用到编译命令。所以在这里编译过程就不解释。如有疑问可以联系我,大家共同学习。