首页 文章

JNI将参数传递给c的方法

提问于
浏览
8

我有一个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”,谢谢 .

EDIT:

I THINK I MADE A MISTAKE
**The Java native method in myClass.java should be public native int init (int argv, char[][] argc);
So there is JNIEXPORT jint JNICALL Java_myClass_init
(JNIEnv *, jobject, jint, jobjectArray);
generated after javah. And in myClass.cpp, i have 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 回答

  • 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
    }
    
  • 2

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

    Java将调用 Java_JPTokenizer_init - 这是您执行转换并调用"plain old" C函数的地方 .

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

  • 0

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

    干杯,菲利普

相关问题