2012-03-20 57 views
2

我一直在研究如何從C++到Java的JNI調用,到目前爲止我沒有任何問題,我設法調用幾乎任何類型的函數。 我說差不多,因爲現在我面對這樣的情況:如何從JNI調用(C++)獲取Java對象?

在Java中,我有這樣的功能:

public static Object getJObject(int id){ 
    Object st = null; 
    switch (id){ 
     case 0: st = "hello"; break; 
     case 1: st = "bye"; break; 
     case 2: st = 1; break; 
     case 3: st = 2; break; 
     case 4: st = 3; break; 
    } 
    return st; 
} 

正如你所看到的,這個函數返回一個不同類型的值給出的ID作爲參數收到。

嘗試從C++獲取該對象時出現問題。下面是使JNI調用的函數:

bool check(){ 
    JniMethodInfo methodInfo; 
    jobject jobj; 

    bool b = getStaticMethodInfo(methodInfo, "org.example.act.activity", "getJObject", "()Ljava/lang/Object;"); 

    if (!b){ 
     CCLog("getJObject method not found"); 
     return false; 
    }else{ 
     jobj = methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID, 0); 
     return true; 
    } 
} 

注:(雖然我認爲這是明顯的)指出, getStaticMethodInfo方法設置在一個Java類識別方法的全過程。它適用於我呼叫的其他所有功能,除此之外。

這是我唯一想做的事......我很肯定這是關於指定方法類型的簽名,但也許我錯了。 到目前爲止,我已經找到了關於獲取類對象或字符串的答案,但是我沒有在適當的Java對象上找到任何東西...

+0

它是如何失敗的?一個對象實例*是一個類實例。儘管我會認真地建議你圍繞該方法編寫一些Java包裝,以返回可能的最具體的類。無論如何,僅返回一個Object實例就是代碼異味。 – 2012-03-20 22:56:26

回答

3

您提供給getStatiticMethodInfo的簽名與該方法不匹配。用於接受一個int參數,並返回Object的方法,所述簽名應該是:(I)Ljava/lang/Object;

IIRC,方法簽名語法在幾個地方,包括描述:

  • JNI規範,和
  • JVM規格
+0

AW男人,我不敢相信我錯過了那個小小的錯誤......它總是如此哈哈! 嗯,現在已經解決了,雖然事實證明,C++中jobject的轉換得到了災難性的結果:/ 非常感謝! – ASM 2012-03-21 00:00:48

1

仔細檢查包名和類名是否正確,簽名與javap -s的輸出一致。

但這是一個可怕的設計。

+0

是的,編輯完這個微小的錯誤(從我選擇的正確答案)之後,jobject轉換結果顯示的只是實際值:/ 感謝您的回覆! – ASM 2012-03-21 00:02:53