如何从C文件函数(Java Native Interface)中仅调用Java的返回值

ast*_*all 1 c java methods java-native-interface return

我有一个Java文件,它声明了我的C文件中定义的本机方法average().该方法取两个数的平均值,打印"在C中,数字为n1,n2"(n1和n2为输入数字),并将平均值作为double返回.

然后Java文件调用average()方法,打印"在Java中,平均值为(n1 + n2)/ 2",然后打印平均值x 2.

以下是数字3和2(运行我的Java文件)的示例:

在C中,数字是3和2

在Java中,平均值为2.5

在C中,数字是3和2

5

我想只将C文件的返回值(平均值)乘以2.我不希望字符串"在C中,数字是3和2"再次打印.如何仅从C文件中打印返回值(平均值)而不再打印字符串"在C中,数字为3和2"?我知道我可以创建另一种方法,但这将是非常重复的.

我的Java文件如下:

public class TestJNIPrimitive {

    static {
        System.loadLibrary("myjni"); //myjni.dll (Windows)
    }

    private native double average(int n1, int n2);
    public static void main(String args[]) {

        System.out.println("In Java, the average is " + new TestJNIPrimitive().average(3,2));
        double result = new TestJNIPrimitive().average(3,2);
        System.out.println(result*2);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的C文件如下:

JNIEXPORT jdouble JNICALL Java_TestJNIPrimitive_average(JNIEnv *env, jobject thisObj, jint n1, jint n2) {

    printf("In C, the numbers are %d and %d\n", n1, n2);
    jdouble result;
    result = ((jdouble)n1 + n2) / 2.0;
    // jint is mapped to int, jdouble is mapped to double
    return result;
}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

Jas*_*zun 5

除非我遗漏了什么,否则你根本不能average两次调用你的C 函数,只需在调用一次后存储结果:

public static void main(String args[]) {
    double result = new TestJNIPrimitive().average(3,2);
    System.out.println("In Java, the average is " + result);
    System.out.println(result*2);
}
Run Code Online (Sandbox Code Playgroud)