2013-07-13 3 views
0

Мне нужно создать экземпляр класса Java в моем родном коде. Чтобы сделать это, я использую следующий код C:Создание Java-класса из JNI

jobject Java_com_mypackage__myClass_myMethod(JNIEnv* env, jobject thiz, jint index){ 
    int fd = pDevs[index].ufds.fd; // fd = open(....); it's a input/eventX file. 
    jclass class = (*env)->FindClass(env,"com/mypackage/ClassName"); 
    jmethodID mid = (*env)->GetMethodID(env,class,"<init>","(Ljava/lang/String;)V"); 
    return (*env)->NewObject(env,class,mid,(*env)->NewStringUTF(env, pDevs[index].device_path)); 
} 

Но когда я призываю MyMethod, я получаю фатальный сигнал 11 (SIGSEGV). Код неправильный?

+2

Ваш системный журнал, вероятно, содержит важную информацию, например. в какой функции был выдан сигнал. Кроме того, вы должны проверить возвращаемые значения fron JNI-вызовы, которые вы делаете: не 'class' ** NULL **? Не 'mid' ** NULL **? –

ответ

1

Вы должны использовать регистрацию/debbuger, чтобы найти место, где произошла ошибка сегментации. Самый простой способ заключается в использовании андроида системы регистрации, как описан here

jclass class = (*env)->FindClass(env,"com/mypackage/ClassName"); 
if(class == null) 
{ 
    __android_log_print(ANDROID_LOG_VERBOSE, "TAG", "class is null"); 
} 

Например, если ИмяКласс является внутренним классом какой-либо деятельности, вы должны использовать COM/MyPackage/ActivityName # ClassName вместо ком/MyPackage/ИмяКласс. Но я могу только догадываться, прежде чем предоставлять свои журналы.

+0

Мне не было известно, как печатать журналы в собственном коде, это было действительно полезно. – Vektor88

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