2012-03-20 54 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