2014-01-02 5 views
3

Я пытаюсь вызвать java-метод из кода NDK. код C++:Вызов метода Java из Android NDK SIGSEGV

extern "C" JNIEXPORT jboolean JNICALL 
Java_com_lipman_whiteboard_CameraProcessing_processBitmap(JNIEnv * env, jobject obj) 
{ 
jclass callingClass = env->GetObjectClass(obj); 
jmethodID mid = env->GetMethodID(callingClass, "setProgressMax", "(I)V"); 
env->CallVoidMethod(obj, mid, 7); 
} 

«mid» всегда имеет значение null в приведенном выше фрагменте. Соответствующими частями класса java являются:

public class CameraProcessing 
{ 
private static native boolean processBitmap(); 

private void setProgressMax(int max) 
{ 
} 

Кто-нибудь знает, почему «середина» всегда равна нулю? Что я делаю не так?

+0

Эй, будьте скучным и скажите, что вы используете proguard? – Tom

+0

, вы должны добавить к нему тег «JNI», видя, что именно здесь вы используете. Я бы попытался помочь, но это было давно, так как я сам JNI ... Единственное, что я могу придумать, это то, что вы не указали свой код инициализации для указателя env. – Dennis

+0

потому что функция закрыта. – eozgonul

ответ

3

Вы указали, что родной метод processBitmap() является статическим, что означает, что второй аргумент равен jclass, а не jobject. Когда вы вызываете GetObjectClass, вы фактически получаете класс jclass, что означает, что callingClass - это просто java.lang.Class, который не определяет метод setProgressMax. Там должно быть исключение, ожидающее сообщения с этим сообщением.

Изменить объявление на:

private native boolean processBitmap(); 

и повторите попытку.

Вызов частного метода не должен быть проблемой JNI.

Кроме того, убедитесь, что вы проверяете исключения после того, как CallVoidMethod возвращается.

+0

Блестящий. Спасибо, что решил. – mlipman

Смежные вопросы