通过 JNI 调用简单的 java 静态方法不起作用,尽管 c++ 编译并运行它

Posted

技术标签:

【中文标题】通过 JNI 调用简单的 java 静态方法不起作用,尽管 c++ 编译并运行它【英文标题】:Calling simple java static method via JNI does not work, though c++ compiles and run it 【发布时间】:2015-02-24 10:13:39 【问题描述】:

考虑这个带有静态方法的Java类:

public class TestClass
    public string str;
    public TestClass() 
        str = "Test From Java";
    
    public static String staticMethod() 
        return "Test From Java";
    

我已经在 c++ 文件中编写了这些代码行:

QandroidJniObject str =  QAndroidJniObject::callStaticObjectMethod(
                                   "org/.../TestClass"
                                   ,"staticMethod"
                                   ,"(V)Ljava/lang/String;");

似乎一切正常,但我不知道如何使用str 对象。我尝试使用str.tostring() 方法将其转换为QString 对象,但它总是返回一个空字符串。 为什么它不能按预期工作?我还测试了 ()Ljava/lang/String; 的方法签名,但没有成功! 提前致谢。

【问题讨论】:

【参考方案1】:

在调用该方法时应在<...>中指定返回的JNI类型:

QAndroidJniObject str =  QAndroidJniObject::callStaticObjectMethod<jstring>(
                               "org/.../TestClass"
                               ,"staticMethod");

QString string = str.toString();

这里不需要定义签名,因为你的函数没有参数。

【讨论】:

谢谢内贾特。它成功地工作了。但是返回类型是字符串并且有一些输入参数的静态方法呢?我尝试使用 callStaticObjectMethod 但没有匹配的功能:QAndroidJniObject::callStaticObjectMethod&lt;jstring&gt;("org/.../TestClass" ,"staticMethod" ,"(Ljava/lang/String;)Ljava/lang/String;" ,val.object&lt;jstring&gt;()); val 是一个 QAndroidJniObject:QAndroidJniObject::fromString("This is test"); 你的方法似乎没有错,我想不出任何东西。可能最好在一个新问题中提出这个问题并进行更多描述。

以上是关于通过 JNI 调用简单的 java 静态方法不起作用,尽管 c++ 编译并运行它的主要内容,如果未能解决你的问题,请参考以下文章

Android NDK开发之Jni调用Java对象

如何使用JNI管理C ++代码中的静态变量?

JNI知识点总结

JNI/NDK开发指南——C/C++访问Java实例方法和静态方法

JNI/NDK开发指南——C/C++访问Java实例方法和静态方法

JNI