JNI中的java类参数传递
2015-11-17 21:36
399 查看
在com.example.test中有两个类javaclass1.java和javaclass2.java,这两个是native的传递参数类型,下面说说如何将这样的参数类型从java传递到jni中,又如何冲jni传递到C中。jni的java接口文件:
public class testJNI { public static final int a = 0; public static final int b = 1; public static final int c = 2; public static final int d = 3; public native int function1(javaclass1 param_in); public native int function2(javaclass2 param_in); static { System.loadLibrary("exampleJNI"); } }下面以fuction1为例说明java类参数如何传递:
<pre name="code" class="cpp">JNIEXPORT jint JNICALL Java_com_example_test_function1(JNIEnv *env, jobject obj, jobject objp) { javaclass1 param_in; int flag = 0; jclass objClass = (*env)->FindClass(env, "com/example/test/javaclass1");//这里必须直接指明参数类型 jfieldID membername1 = (*env)->GetFieldID(env, objClass, "member1", "I"); jfieldID membername2 = (*env)->GetFieldID(env, objClass, "member2", "I"); jfieldID membername3 = (*env)->GetFieldID(env, objClass, "member3", "I"); jfieldID membername4 = (*env)->GetFieldID(env, objClass, "member4", "I"); jint membervalue1 = (*env)->GetIntField(env, objp, membername1); jint membervalue2 = (*env)->GetIntField(env, objp, membername2); jint membervalue3 = (*env)->GetIntField(env, objp, membername3); jint membervalue4 = (*env)->GetIntField(env, objp, membernane4); //将解析出来的参数打包,传递给C function param_in.member1 = membervalue1; param_in.member2 = membervalue2; param_in.member3 = membervalue3; param_in.member4 = membervalue4; handle = cfunctioncall1(¶m_in);//c 函数 if(handle == NULL) { flag = -1; } return((jint) flag); }
<pre name="code" class="cpp">下面说说包含数组的java类参数传递
JNIEXPORT jint JNICALL Java_com_example_test_function2(JNIEnv *env, jobject obj, jint cmd, jobject objp){double* gx_data, *gy_data, *gz_data;javaclass2 g_data;// javaclass 里面包含三个大小一样double类型的数组jclass objClass = (*env)->FindClass(env, "com/example/testact/javaclass2");//获取参数的类型jfieldID gx_name = (*env)->GetFieldID(env, objClass, "gx", "[D");//获取域名jfieldID gy_name = (*env)->GetFieldID(env, objClass, "gy", "[D");jfieldID gz_name = (*env)->GetFieldID(env, objClass, "gz", "[D");jdoubleArray gx_objArray = (*env)->GetObjectField(env, objp, gx_name);//获取数组类型域,这个与int的成员不同,要进一步解析jdoubleArray gy_objArray = (*env)->GetObjectField(env, objp, gy_name);jdoubleArray gz_objArray = (*env)->GetObjectField(env, objp, gz_name);jdouble* gx_ptr = (*env)->GetDoubleArrayElements(env, gx_objArray, NULL);//获取数据指针jdouble* gy_ptr = (*env)->GetDoubleArrayElements(env, gy_objArray, NULL);jdouble* gz_ptr = (*env)->GetDoubleArrayElements(env, gz_objArray, NULL);jsize len = (*env)->GetArrayLength(env, gx_objArray);// 数组长度gx_data = (double*)Mymalloc(len, sizeof(double));//copy到本地用的buffergy_data = (double*)Mymalloc(len, sizeof(double));gz_data = (double*)Mymalloc(len, sizeof(double));if((gx_data == NULL)||(gy_data == NULL)||(gz_data == NULL)){LOGE("Err! malloc memory failed! %s %d\n", __FILE__, __LINE__);goto err;}memcpy(gx_data, gx_ptr, sizeof(double)*len);//copy到本地memcpy(gy_data, gy_ptr, sizeof(double)*len);memcpy(gz_data, gz_ptr, sizeof(double)*len);(*env)->ReleaseDoubleArrayElements(env, gx_objArray, gx_ptr, 0);//释放,这个是必须的,切勿忘记(*env)->ReleaseDoubleArrayElements(env, gy_objArray, gy_ptr, 0);(*env)->ReleaseDoubleArrayElements(env, gz_objArray, gz_ptr, 0);g_data.gx = gx_data;g_data.gy = gy_data;g_data.gz = gz_data;jint ret = cfunctioncall2(handle, cmd, (unsigned int)&g_data));Myfree(gx_data);Myfree(gy_data);Myfree(gz_data);return(ret);err:Myfree(gx_data);Myfree(gy_data);Myfree(gz_data);return((jint)(-1));}码字不易,转载请注明出处
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- 详解HDFS Short Circuit Local Reads
- PropertyChangeListener简单理解
- 插入排序