我有一个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 回答
您可以像创建任何其他C代码一样创建类的对象并调用方法 .
Java对象和C基元之间没有直接映射,因此您必须转换Java运行时环境传递的参数,然后调用您的函数 .
Java将调用
Java_JPTokenizer_init
- 这是您执行转换并调用"plain old" C函数的地方 .要转换字符串数组,首先需要访问数组,然后是单个字符串 .
有关阵列访问权限,请参阅http://java.sun.com/docs/books/jni/html/objtypes.html#5279 .
有关字符串访问权限,请参阅http://java.sun.com/docs/books/jni/html/objtypes.html#4001 .
通常当我需要访问本机库时,我使用JNA而不是JNI . 通常JNA比JNI更容易设置,因此您可能想尝试一下 .
干杯,菲利普