我有一个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 }
的
答案 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更容易设置,因此您可能需要尝试一下。
干杯, 菲利普