JNI知識(六)Java調用C++/C函數參數是輸出參數類型爲String

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++/CJava的調用。

這裏構造了一個StringOut類是因爲JavaString類是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 表示既是輸入參數也是輸出參數。

也就是說給輸出參數分配空間有調用者分配,這樣更符合大多數人的習慣。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章