2013-07-13 116 views
0

我需要在我的本機代碼中創建一個Java類的實例。要做到這一點,我用下面的C代碼:從JNI實例化Java類

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

您的系統日誌可能包含重要的信息,例如,信號發出的功能。另外,你應該檢查你所做的JNI調用的返回值:不是'class' ** NULL **?是不是'中**'**空**? –

回答

1

您應該使用logging/debbuger來查找發生分段錯誤的地方。最簡單的方法是使用Android測井系統的描述 here

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

例如,如果類名是一個內部類的一些活動,你應該使用,而不是COM/mypackage中/類名COM/mypackage中/ ActivityName#類名的。但是我只能在提供日誌之前猜測。

+0

我不知道如何在本地代碼中打印日誌,這非常有幫助。 – Vektor88