#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’ через ‘…’; вызов будет прерван во время выполнения.