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 ++的方法的主要内容,如果未能解决你的问题,请参考以下文章