JNI передает параметры методу c ++ - PullRequest
8 голосов
/ 11 июля 2011

У меня есть c ++ файл myCppTest.cpp, который имеет метод

int myFunction(int argv, char **argc) {
}

и нативный метод Java в myClass.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", спасибо.

РЕДАКТИРОВАТЬ: Я думаю, что я сделал ошибку

Нативный Java-метод в myClass.java должен быть
public native int init (int argv, char[][] argc);

Так что есть

JNIEXPORT jint JNICALL Java_myClass_init
  (JNIEnv *, jobject, jint, jobjectArray);

генерируется после джавах И в 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 
}

Ответы [ 3 ]

2 голосов
/ 11 июля 2011

Вы можете создать объект класса и вызвать метод, как и любой другой код 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 голосов
/ 11 июля 2011

Прямого сопоставления между объектами Java и примитивами C ++ не существует, поэтому вам придется преобразовать аргументы, передаваемые средой выполнения Java, а затем вызвать вашу функцию.

Java вызовет Java_JPTokenizer_init- здесь вы выполняете преобразование и вызываете свою «простую старую» функцию C ++.

Чтобы преобразовать массив строк, вам сначала потребуется получить доступ к массиву, а затем к отдельным строкам.

0 голосов
/ 11 июля 2011

Обычно, когда мне нужно получить доступ к собственной библиотеке, я использую JNA вместо JNI.Обычно JNA гораздо проще настроить, чем JNI, поэтому вы можете попробовать его.

Cheers, Felipe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...