JNI通过引用返回数据

时间:2013-04-20 12:36:08

标签: java java-native-interface

我正在为我的本机代码编写JNI包装器,我的代码是fallows

我的java原生方法 - >

public native static String GetMimo(String input, String out1,
        String out2);

My C native方法 - >

jstring Java_test_mimo_mimojni_DataFecth_GetMimo( JNIEnv* env,String input, String output1, String output2);
{

char *outmimoOne , *outmimoTwo;
GetMimo(&outmimo, &outmimoTwo); // My Native code function call , it allocates the memory and fill the data 

return (*env)->(env,outmimoTwo);
}

这里我想将数据outmimoOne返回到output1,将outmimoTwo返回到output2。 由于我是Java的新手,我究竟能将这两个变量都返回到我的java调用中,作为我们在C中的引用获取。

3 个答案:

答案 0 :(得分:0)

创建一个包含两个引用的对象或数据结构,并返回:

public class Pair<T1, T2> {
    private final T1 x;
    private final T2 y;

    public Pair<T1, T2>(T1 a, T2 b) {
        this.x = a;
        this.y = b;
    }

    public T1 getX() { return this.x; }
    public T2 getY() { return this.y; }
}

答案 1 :(得分:0)

虽然我更喜欢将结果作为返回值返回,但它是C中的样式问题。如果要在Java中模仿该样式,则必须使用容器对象作为参数。传统的方法是传递一个数组对象,期望函数将结果设置为第一个元素。因为,在您的情况下,您正在使用String参数,您可以创建并传递java.lang.StringBuilder个对象作为参数,并且该函数可以追加值。

在任何一种情况下,您都必须使用JNI API在C端进行大量工作,以将您的值设置到参数对象中。

答案 2 :(得分:-1)

你做不到。参数在Java中按值传递。因此,该方法接收调用者对out1(和out2)的引用的副本

表示,调用者无法看到您分配给此副本的任何内容,因为这是一个副本。