JNI通过引用返回数据



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

我的java本地方法->

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

我的C本地方法->

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中所做的get by reference。

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

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; }
}

虽然我更喜欢返回结果作为返回值,但这是c中的样式问题。如果您想在Java中模仿该样式,则必须使用容器对象作为参数。传统的方法是传入一个数组对象,并期望函数将结果设置为第一个元素。由于在您的示例中使用的是String参数,因此您可以创建并传递java.lang.StringBuilder对象作为参数,并且该函数可以附加值。

无论哪种情况,您都必须在C端使用JNI API做大量的工作,以便将您的值设置到参数对象中。

你不能。在Java中,参数是按值传递的。因此,该方法接收调用者对out1(和out2)引用的副本。无论你给这个副本赋值什么,调用者都不会看到,因为它是一个副本

最新更新