如何从JNI调用(C+;+;)获取Java对象? 我一直在研究如何从C++到java进行JNI调用,到目前为止我还没有任何问题,我设法调用了几乎任何类型的函数。 我说差不多,因为现在我面临这样的情况:

如何从JNI调用(C+;+;)获取Java对象? 我一直在研究如何从C++到java进行JNI调用,到目前为止我还没有任何问题,我设法调用了几乎任何类型的函数。 我说差不多,因为现在我面临这样的情况:,java,android,object,java-native-interface,Java,Android,Object,Java Native Interface,在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 =

在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对象的问题…

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


但是这是一个糟糕的设计。

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


但是这是一个糟糕的设计。

您提供给
GetStatisticMethodInfo
的签名与方法不匹配。对于采用
int
参数并返回
对象的方法,签名应为:
(I)Ljava/lang/Object

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

  • JNI规范,以及
  • JVM规范

您提供给
GetStatisticMethodInfo
的签名与方法不匹配。对于采用
int
参数并返回
对象的方法,签名应为:
(I)Ljava/lang/Object

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

  • JNI规范,以及
  • JVM规范

它是如何失败的?对象实例是类实例。尽管我郑重建议您围绕该方法编写一些Java包装器,以尽可能返回最特定的类。只返回一个对象实例是代码的味道。它怎么会失败呢?对象实例是类实例。尽管我郑重建议您围绕该方法编写一些Java包装器,以尽可能返回最特定的类。只返回一个对象实例就是代码味道。天哪,我真不敢相信我错过了那个小错误。。。事情总是这样的哈哈哈!现在解决了,虽然事实证明,C++中的JOB项目的转换会带来灾难性的后果:我真不敢相信我错过了那个小错误。。。事情总是这样的哈哈哈!现在解决了,虽然事实证明,C++中的JOB项目的转换会带来灾难性的后果:是的,在编辑了这个微小的错误(我选择的答案是正确的)之后,jobject转换结果显示了除了实际值以外的任何东西:/不过感谢您的回复!是的,在编辑了这个微小的错误(我选择的答案是正确的)之后,jobject转换结果显示了除了实际值以外的任何东西:/不过感谢您的回复!