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

Posted

技术标签:

【中文标题】JNI将参数传递给c ++的方法【英文标题】:JNI pass parameters to method of c++ 【发布时间】:2011-10-02 22:35:12 【问题描述】:

我有一个包含方法的 c++ 文件 myCppTest.cpp

int myFunction(int argv, char **argc)

和 myClass.java 中的 Java 本机方法

公共本机 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) //需要在myCppTest.cpp中调用int myFunction(int argv, char **argc)

如何将参数“jint argv, jobjectArray argc”传递给“int argv, char **argc”,谢谢。

编辑:

我想我犯了一个错误

myClass.java 中的 Java 本机方法应该是 公共本机 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) //需要在myCppTest.cpp中调用int myFunction(int argv, char **argc)

【问题讨论】:

【参考方案1】:

您可以像任何其他 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

【讨论】:

尼克,我在原来的问题中犯了一个错误。 你上面有并列的argc和argv吗? 不创建myClass对象myClass obj;覆盖jobject类型函数声明的第二个参数并抛出错误,因为类型不匹配?..【参考方案2】:

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

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

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

有关数组访问,请参阅http://java.sun.com/docs/books/jni/html/objtypes.html#5279。

有关字符串访问,请参阅http://java.sun.com/docs/books/jni/html/objtypes.html#4001。

【讨论】:

我知道这是旧的,但这些链接都不起作用。最好将所需代码的片段与链接一起放置(以防链接中断)。【参考方案3】:

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

干杯, 费利佩

【讨论】:

谢谢,但在我的情况下必须使用 JNI。

以上是关于JNI将参数传递给c ++的方法的主要内容,如果未能解决你的问题,请参考以下文章

C#将方法作为参数传递给另一个方法[重复]

C – 将可变数量的参数传递给 main

java中,如何用POST方法将参数传递给第三方网站

怎么将可变参数的函数的参数传递给另一个可变参数的函数

如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?

如何将 char* 参数传递给在 Node.js 中执行的 C 方法?