通过JNI实现C语言设置Java二维字符串数组并返回该字符串数组


第一步: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来生成的所以没有用到编译命令。所以在这里编译过程就不解释。如有疑问可以联系我,大家共同学习。

你可能感兴趣的:(java,jni,C语言,二维字符串数组,返回二维字符串数组)