【问题标题】:JNI - How to get the Double.toString() method to convert a jdouble to a jstringJNI - 如何获取 Double.toString() 方法以将 jdouble 转换为 jstring
【发布时间】:2021-02-04 07:30:57
【问题描述】:

所以我希望能够使用将 jdouble 转换为 jstring 来自 c++ 的内置 Double.toString()。

我认为我会这样做。

jdouble result;

//Get the class for Double so we can get the method id of toString().
jclass doubleObjectClass = env->GetObjectClass("Ljava/lang/Double;");

//Get the Double.toString() method ID.
jmethodID doubleToStringMethodID = env->GetMethodID(doubleObjectClass, "toString",(Ljava/lang/String;");

//Call the toString() method on result.
jstring newString = env->CallObjectMethod(..., doubleToStringMethodID, result);

现在的问题是当我调用 getObjectClass 和 CallObjectMethod 时发生了什么。

使用 getObjectClass,它需要从内存中获取一个对象,而不是描述。

对于 CallObjectMethod,我们需要 Double 对象作为参数('...' 所在的位置)。

所以我不知道如何继续,因为文档对 atm 没有帮助。

任何帮助将非常感谢!

【问题讨论】:

    标签: java c++ java-native-interface double tostring


    【解决方案1】:

    当您可以访问混凝土jobject 时,您使用GetObjectClass。如果你只有一个类名,那就是 FindClass 带有类的二进制名称的函数。您正在查找 static 方法 ID,因此这是一组不同的函数(GetStaticMethodIDCallStaticMethodID)。最后,方法签名必须正确。

    把它们放在一起:

    jdouble result;
    jclass doubleObjectClass = env->FindClass("java/lang/Double");
    jmethodID doubleToStringMethodID = env->GetStaticMethodID(doubleObjectClass, "toString","(D)Ljava/lang/String;");
    jstring newString = env->CallStaticObjectMethod(doubleObjectClass, doubleToStringMethodID, result);
    

    【讨论】:

    • 干杯我没有意识到 toString() 是一个静态方法。我一直以为是实例,似乎被一些互联网资源误导了。
    • Double 类同时具有静态方法toString(double d) 作为实例方法Double#toString。如果没有静态方法,则必须先创建一个新的Double 对象,然后对其调用实例方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多