如何从JNI调用(C ++)获取Java对象?

时间:2012-03-20 22:50:37

标签: java android object java-native-interface

我一直在研究如何从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对象上找到任何东西......

2 个答案:

答案 0 :(得分:3)

您向getStatiticMethodInfo提供的签名与该方法不符。对于采用int参数并返回Object的方法,签名应为:(I)Ljava/lang/Object;

IIRC,方法签名语法在几个地方描述,包括:

  • JNI规范和
  • JVM规范

答案 1 :(得分:1)

仔细检查您的包名和类名是否正确,以及签名是否与javap -s的输出一致。

但这是一个糟糕的设计。