Java接口是出參的可以有兩種方式,第一是把出參作爲Java類的meber,還有一種是把出參作爲Java接口的參數。
1) 出參作爲Java類的static member
例如 :java接口:
public class Person{
static {
system.loadLibrary("person_jni");
}
public static String name = null;// 這裏根據實際情況,不一定非要定義爲static
public boolean getName()
{
boolean ret = PersonNative. getName_native();
return ret;
}
public static synchronzied native getName_native();
}
JNI function:
JNIEXPORT jboolean JNICALL Java_getName_ 1native (JNIEnv *env, jclass thiz)
{
char name[100];
jboolean ret = getPersonName(&name); // 調用更下層的函數得到name
jstring jstrName = env->NewStringUTF(name);
jclass cls = env->FindClass("com/Person");
jfieldID fid = env->GetStaticFieldID(cls, "name ", "Ljava/lang/String;");
env->SetStaticObjectField(cls, fid, jstrName);
return ret;
}
但是這種方式覺得還是沒有C++傳統的把輸出參數也寫到參數列表中好。
2) 出參作爲Java接口的參數
還是以上面爲例:
Java接口:
public class StringOut {
public String mString;
public StringOut(String str){
mString = str;
}
public StringOut(){
}
}
public class Person{
static {
system.loadLibrary("person_jni");
}
public boolean getName(StringOut name)
{
boolean ret = PersonNative. getName_native(name);
return ret;
}
public static synchronzied native getName_native(StringOut name);
}
JNI function:
JNIEXPORT jboolean JNICALL Java_getName_ 1native (JNIEnv *env, jclass thiz)
{
char name[100];
jboolean ret = getPersonName(&name); // 調用更下層的函數得到name
jclass stringOutCls = env->FindClass("com/ StringOut");
jmethodID InitId = env->GetMethodID(stringOutCls, "<init>", "(Ljava/lang/String;)V");
env->CallVoidMethod(stObjectDes, InitId, strOutData);
return ret;
}
這裏用到的給Java類成員變量賦值方法和上面不同,是調用了Java Class的構造函數賦值的。這裏用到了C++/C對Java的調用。
這裏構造了一個StringOut類是因爲Java的String類是final類,所以要重構造一個類把String封裝起來。
下面以一個簡單例子給出Java輸出參數的一般情況。
C/C++ :
Struct output_result foo(int input, int *output, int input_output, struct ST_input, struct *ST_output, struct *input_output);
Java:
Class output_result foo(int input, int output[], int input_output[], struct ST_input, class ST_output, class input_output);
input表示是輸入參數,output表示是輸出參數,input_output 表示既是輸入參數也是輸出參數。
也就是說給輸出參數分配空間有調用者分配,這樣更符合大多數人的習慣。