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 表示既是输入参数也是输出参数。

也就是说给输出参数分配空间有调用者分配,这样更符合大多数人的习惯。


本文出自 “肉肉之家” 博客,请务必保留此出处http://4895268.blog.51cto.com/4885268/1369861

JNI知识(六)Java调用C++/C函数参数是输出参数类型为String,布布扣,bubuko.com

JNI知识(六)Java调用C++/C函数参数是输出参数类型为String

上一篇:Python学习笔记(1_list)


下一篇:Python 调用libguestfs 实现文件注入(Openstack)