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 表示既是输入参数也是输出参数。
也就是说给输出参数分配空间有调用者分配,这样更符合大多数人的习惯。