JNI: вызов метода из C , который принимает объект

#java #c #java-native-interface

#java #c #java-native-interface

Вопрос:

У меня простая проблема, на которую я, похоже, не могу найти ответ. Я написал метод на C , который должен вызывать метод на Java, который принимает объект. Например, мой Java-код имеет:

 public class MyClass {

    public class ReturnType {
    ...
    }

    public void methodToBeCalledFromC( ReturnType obj ) {
    ...
    }
}
  

И мой C имеет:

 const jclass classID = s_env->FindClass( className );
const jmethodID methodID = s_env->GetMethodID( classID, "methodToBeCalledFromC", "(LMyClass;)V" );

// The call.handler() function returns a reference to the ReturnType object
// This produces a compilier warning and causes a seg-fault.
s_env->CallVoidMethod( call.handler(), jmid, userInfo );
  

Я проверил classID и methodID, а также call.handler() возвращает jbject, для NewGlobalRef() которого я вызвал, поэтому я думаю, что все в порядке.

Можно ли передать jobject таким образом?

Комментарии:

1. Есть ли у вас ссылка jobject на объект, для которого вы хотите вызвать метод?

2. ДА. Это возвращаемый тип вызова функции call.handler(). Этот класс в основном содержит объект и создает глобальную ссылку на него, чтобы гарантировать, что он имеет тот же срок службы, что и объект c , который его содержит. Если это не сработает (чего не произошло), я получу сообщение об ошибке намного раньше.

3. О каком предупреждении компилятора вы упомянули?

4. @Ernest Привет! Это было оно! Когда я копировал предупреждение компилятора, я заметил, что ‘userInfo’ не был jobject! Извините! Я чувствую себя действительно глупо! Отправьте в качестве ответа, чтобы я мог его принять.

Ответ №1:

Проверьте предупреждение компилятора — оно может сообщить вам что-то важное!

Комментарии:

1. Предупреждение было следующим: предупреждение: невозможно передать объекты не-POD типа ‘class userInfo’ через ‘…’; вызов будет прерван во время выполнения.