JNI将参数传递给c ++的方法

时间:2011-07-11 16:01:56

标签: java c++ java-native-interface

我有一个c ++文件myCppTest.cpp,它有方法

int myFunction(int argv, char **argc) {
}

和 myClass.java中的Java本机方法

public native int myFunction (int argv, char[][] argc);

使用javah -jni myClass生成头文件后,我有标题

JNIEXPORT jint JNICALL Java_JPTokenizer_init
  (JNIEnv *, jobject, jint, jobjectArray);

在myClass.cpp中,我定义了

JNIEXPORT jint JNICALL Java_JPTokenizer_init
  (JNIEnv *env, jobject obj, jint argv, jobjectArray argc) {
        //need to call int myFunction(int argv, char **argc) in myCppTest.cpp 
}

我怎样才能将参数“jint argv,jobjectArray argc”传递给“int argv,char ** argc”,谢谢。

编辑:

我认为我犯了错误

myClass.java中的Java本机方法应为

public native int init (int argv, char[][] argc);

所以有

JNIEXPORT jint JNICALL Java_myClass_init
  (JNIEnv *, jobject, jint, jobjectArray);

在javah之后生成。 在myClass.cpp中,我有

JNIEXPORT jint JNICALL Java_myClass_init
  (JNIEnv *env, jobject obj, jint argv, jobjectArray argc) {
        //need to call int myFunction(int argv, char **argc) in myCppTest.cpp 
}

3 个答案:

答案 0 :(得分:2)

您可以像创建任何其他C ++代码一样创建类的对象并调用方法。

JNIEXPORT jint JNICALL Java_JPTokenizer_init
    (JNIEnv *env, jobject obj, jint argv, jobjectArray argc) {
      myClass obj;  //create object of the class you want
      obj.myFunction((int) argv, (char *) &argc); //call the method from that object
}

答案 1 :(得分:2)

Java对象和C ++原语之间没有直接映射,因此您必须转换Java运行时环境传递的参数,然后调用您的函数。

Java将调用Java_JPTokenizer_init - 这是您执行转换并调用“普通旧”C ++函数的地方。

要转换字符串数组,首先需要访问数组,然后是单个字符串。

答案 2 :(得分:0)

通常当我需要访问本机库时,我使用JNA而不是JNI。通常,JNA比JNI更容易设置,因此您可能需要尝试一下。

干杯, 菲利普