我正在为我的本机代码编写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)引用的副本。无论你给这个副本赋值什么,调用者都不会看到,因为它是一个副本