jni返回结构体数组

本文详细介绍了JNI如何返回结构体数组的步骤,包括FindClass、NewObjectArray、GetMethodID、GetFieldID等关键操作,并提供了相应的Android代码示例,帮助开发者理解并实现这一功能。


    jni返回结构体数组.这个卡了我两天.好郁闷.从网上找了好多的办法都不成功. 可能是人品问题,呵呵呵 

    好在现在搞定了.把源码贴出来让大家也看看,希望能帮到那些和我人品不好的人嘿嘿..

   其实回想起来.挺简单的. 返回结构体数组有如下步骤.

   /*
  * 返回一个结构体数组步骤
  * 1.通过FindClass找到要返回的android中定义的class.
  * 2.通过NewObjectArray创建一个要返回的结构体数组.
  * 3.通过GetMethodID得到你要返回的class的默认构造方法
  * 4.通过GetFieldID得到定义的class里面所有的成员
  * 5.通过NewObject创建一个对应的class对象
  * 6.通过SetObjectField为5创建的class对象赋值(如果字段为int,那么就用SetIntField这个方法)
  * 7.通过SetObjectArrayElement把创建的class对象放到创建的objectArray里面去
  * 8.返回这个objectArray对象.
  * 9.完成. 就这么简单.
  * */

   是不是简单啊. 嘿嘿嘿嘿.

    好.现在看是放源码.

   android 代码.

   这个代码是activity 代码

package com.example.jnitest2;
 
 import android.os.Bundle;
 import android.app.Activity;
 import android.util.Log;
 import android.view.Menu;
 
 public class MainActivity extends Activity {
 
 	@Override
 	protected void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
 		setContentView(R.layout.activity_main);
 		
 		MX2 changeJni = new MX2();
 		
         changeJni.displayParms("Hello World!", 100, true);
 
         int ret = changeJni.add(12, 20);
         Log.e("logZ", "相加结果为:"+ret);
         
         boolean[] blList = new boolean[] { true, false, true };
         changeJni.setArray(blList);
 
         String[] strLis
### JNI 序列化结构体数据示例 当涉及到JNI (Java Native Interface) 中的结构体序列化时,通常会采用将C/C++中的结构体转换成字节数组的形式以便于传输到Java层。下面是一个简单的例子来展示这一过程。 #### C/C++端定义结构体并实现序列化函数 假设有一个表示书籍信息的简单结构体: ```c // 定义一个书本的信息结构体 typedef struct { char title[100]; int pages; } Book; // 将Book对象转为byte数组形式用于传递给Java侧 JNIEXPORT jbyteArray JNICALL Java_com_example_NativeLib_serializeBook(JNIEnv *env, jobject /* this */, jobject bookObj) { // 假设bookObj已经映射好了对应的字段... // 创建一个新的jbyteArray实例准备返回给调用者 jbyteArray result = (*env)->NewByteArray(env, sizeof(Book)); if (!result) return NULL; // out of memory error thrown // 获取原生指针指向的数据区地址 Book* nativePtr = &((struct Book*) ((*env)->GetDirectBufferAddress(env, bookObj))); // 复制内存至新的数组中去 (*env)->SetByteArrayRegion(env, result, 0, sizeof(*nativePtr), reinterpret_cast<jbyte*>(nativePtr)); return result; } ``` 此段代码展示了如何创建一个名为`serializeBook`的方法[^1],该方法接收来自Java的对象作为参数,并将其内部存储的内容复制到了新分配的一个字节缓冲区内。注意这里简化了一些细节比如错误处理以及实际获取Java对象属性的过程。 #### Java端反序列化接收到的数据流 在Java这边,则需要编写相应的逻辑读取这些原始二进制数据,并重建原来的复杂类型: ```java public class NativeLib { static { System.loadLibrary("nativelib"); // 加载本地库文件 } public native byte[] serializeBook(Object book); private Object deserializeBook(byte[] bytes){ ByteBuffer buffer = ByteBuffer.wrap(bytes); String title = StandardCharsets.US_ASCII.decode(buffer).toString(); int pages = buffer.getInt(); // 构建并返回新的Book实体类实例 return new Book(title.trim(), pages); } } ``` 上述实现了两个重要的功能:一个是把复杂的结构打包成可以跨平台交换的形式;另一个是从这种紧凑表达恢复出完整的业务模型[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值