簡體   English   中英

如何從JNI調用(C ++)獲取Java對象?

[英]How to get a Java Object from JNI call (C++)?

我一直在研究如何進行從C ++到Java的JNI調用,到目前為止,我還沒有遇到任何問題,我設法調用了幾乎所有類型的函數。 我說ALMOST,因為現在我正面臨這種情況:

在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對象上卻找不到任何東西...

您提供給getStatiticMethodInfo的簽名與方法不匹配。 對於采用int參數並返回Object ,簽名應為: (I)Ljava/lang/Object;

IIRC,方法簽名語法在以下兩個地方進行了描述:

  • JNI規范,以及
  • JVM規范

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

但這是一個糟糕的設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM