android开发--- jni返回结构体

来源:互联网 发布:c 语言英文怎么说 编辑:程序博客网 时间:2024/06/06 12:23

1. java 与c 的jni部分有不同的数据类型,但是当jni部分返回值是一个结构体时怎么办呢?网上都是DiskInfo这个例子,但是在我这儿一运行时就会出错,所以修改了一下。
java在调用jni时多加了一个 jobject,

2. jni 中的代码
  1. struct {
  2.     char name[256];
  3.     int serial;
  4. }DiskInfo;

  5. //返回一个结构数组,返回一个硬盘信息的结构数组
  6. JNIEXPORT jobject JNICALL Java_com_example_hellojni_HelloJni_getStruct(JNIEnv *env, jobject _obj, jobject diskobj)
  7. {
  8.     //获取Java中的实例类
  9.     jclass objectClass = (*env)->FindClass(env, "com/example/hellojni/DiskInfo");
  10.     //获取类中每一个变量的定义 
  11.     jfieldID str = (*env)->GetFieldID(env, objectClass,"name","Ljava/lang/String;");
  12.     jfieldID ival = (*env)->GetFieldID(env, objectClass,"serial","I")

  13.     (*env)->SetObjectField(env,diskobj,str, (*env)->NewStringUTF(env, "hello world"));
  14.     (*env)->SetIntField(env, diskobj,ival,10);

  15.     return diskobj    //返回object数组
  16. }
3. DiskInfo.java,新添加的一个class
  1. package com.example.hellojni;

  2. public class DiskInfo {
  3.     public String name; //名字 
  4.     public int serial; //序列号 
  5.     public DiskInfo(int num, String myname){
  6.         serial = num;
  7.         name = myname;
  8.     }
  9. }
4. HelloJni.java 都在onCreate中添加
  1. public void onCreate(Bundle savedInstanceState)
  2.     {
  3.         super.onCreate(savedInstanceState);
  4.         TextView tv = new TextView(this);
  5.         tv.setText( stringFromJNI() ); 

  6.         DiskInfo disk_info_arg = new DiskInfo(123, "abc");
  7.         DiskInfo diskInfo = getStruct(disk_info_arg); 
  8.         System.out.println("name:" + diskInfo.name); 
  9.         System.out.println("Serial:" + diskInfo.serial); 

  10.         setContentView(tv);
  11.     }
  12.     public native String stringFromJNI();
  13.     public native DiskInfo getStruct(DiskInfo disk_info);
[参]http://hi.baidu.com/bluecagali/item/a777cfd326bfa7cf1a72b41a  
      http://bbs.csdn.net/topics/380133924
0 0
原创粉丝点击