2010-11-23 72 views
3

我在JNI(C++)中有一個方法,我希望能夠返回一個自定義的對象類型(不是原始類型或字符串等)。 我已經寫了一些東西,但我不斷得到java.lang。 UnsatisfiedLinkError錯誤。如何使用自定義Object類爲JNI方法定義返回類型?

下面是詳細信息:

的方法:

static jobject Java_android_sdk_Core_ProcessFrame(JNIEnv *env, jobject myobj, jbyteArray frameData) 
    { 

    jclass clazz; 
    jmethodID cid; 
    jobject jCoreOut; 
    static const char* const strClassName = "android/sdk/Core/CoreOutput"; 
    clazz = env->FindClass(strClassName); 
    if (clazz == NULL) { 
     LOGE("Can't find class CoreOutput"); 

    } 
    cid = env->GetMethodID(clazz,"<init>", "()V"); 
    jCoreOut = env->NewObject(clazz, cid); 


    // Free local references 
     env->DeleteLocalRef(clazz); 

    return jCoreOut; 

    } 

我有以下述方式定義的方法描述符:

static const JNINativeMethod gMethods[] = { 
     { "CreateCore", "(III)V", (void*) Java_android_sdk_Core_CreateCore }, 
    { "ProcessFrame", "([B)Landroid/sdk/Core/CoreOutput;", (void*) Java_android_sdk_Core_ProcessFrame } 
}; 

我通過調用執行該方法的登記上:

 if (env->RegisterNatives(clazz, gMethods, 
    sizeof(gMethods)/sizeof(gMethods[0])) != JNI_OK) 
{ 
    LOGE("Failed registering JNI methods"); 
    return result; 
} 

而我的其他本地方法的註冊是成功的。 (我能使用它們...)

當我嘗試調用ProcessFrame方法我從logcat的輸出如下:

11-23 16:10:10.139: ERROR/AndroidRuntime(4923): java.lang.UnsatisfiedLinkError: ProcessFrame 

我敢肯定它是與我沒有正確定義方法。任何人都可以對此有所瞭解嗎?

任何人都可以指出我是一個很好的教程,它涵蓋的不僅僅是處理JNI中的原始類型嗎?

謝謝

伊塔馬爾

+0

我找到了UnsatisfiedLinkError的原因。顯然,我試圖返回一個被定義爲Core內部類的類型是這個問題。一旦我將CoreOutput定義移動到它自己的類文件中,它就起作用了。有沒有人知道如何在這種情況下返回一個內部類? – Ita 2010-11-24 17:34:39

回答

1

UnsatisfiedLinkError當JVM不能找到方法時拋出。所以它與你的方法聲明有關。查看javah爲您創建函數標題。看看這個:javah

+0

我試過使用javah,它給出了與我已經拿到的簽名相同的結果..必須有一些我失蹤的東西... – Ita 2010-11-24 09:18:08