JNI C向Java返回对象数组

Java 代码:

package com.fansen.hellojni;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {

    @SuppressLint("DefaultLocale")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView  tv = new TextView(this);
        tv.setText( "Hello World!" );

        String str = null;

        DiskInfo[] infos = stringFromJNI();
        for (int i = 0; i < infos.length; i++) {
            String aByte = null;
            if (Integer.toHexString(infos[i].value).toUpperCase().length() == 1) {
                aByte = "0" + Integer.toHexString(infos[i].value).toUpperCase();
                Log.i("TAG", "infos[" + i + "].value: " + "0" + Integer.toHexString(infos[i].value).toUpperCase());
            }else {
                aByte = Integer.toHexString(infos[i].value).toUpperCase();
                Log.i("TAG", "infos[" + i + "].value: " + Integer.toHexString(infos[i].value).toUpperCase());
            }
            if (str == null) {
                str = aByte;
            }else {
                str = str + aByte;
            }
        }
        Log.i("TAG", "str: " + str);
        setContentView(tv);
    }

    public native DiskInfo[]  stringFromJNI();

    static {
        System.loadLibrary("hello-jni");
    }

}

class DiskInfo{
    public int data;
    public int value;
    public int number;
}

C代码:

#include <string.h>
#include <jni.h>

typedef struct{
    int data;
    int value;
    int number;
} DiskInfo;

jobjectArray  Java_com_fansen_hellojni_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz )
{
    jclass clsDiskInfo = (*env)->FindClass(env, "com/fansen/hellojni/DiskInfo");
    jobjectArray infos = (*env)->NewObjectArray(env, 10, clsDiskInfo, NULL);

    jfieldID dataID = (*env)->GetFieldID(env, clsDiskInfo, "data", "I");
    jfieldID valueID = (*env)->GetFieldID(env, clsDiskInfo, "value", "I");
    jfieldID numberID = (*env)->GetFieldID(env, clsDiskInfo, "number", "I");
    jmethodID consID = (*env)->GetMethodID(env, clsDiskInfo, "<init>", "()V");

    unsigned char send[10] = {0xFF,0x1F,0x07,0x08,0x00,0x00,0x01,0x02};

    int sendcopy[10] = {0};
    int j;
    for(j = 0; j <= 8; j++){
        sendcopy[j] = send[j];
    }

    int i;
    jobject obj;
    for(i = 0; i < 10; i++){
        obj = (*env)->NewObject(env, clsDiskInfo, consID);
        (*env)->SetIntField(env, obj, dataID, (jint)i);
        (*env)->SetIntField(env, obj, valueID, (jint)sendcopy[i]);
        (*env)->SetIntField(env, obj, numberID, (jint)i);
        (*env)->SetObjectArrayElement(env, infos, i, obj);
    }
    return infos;
}
时间: 2024-11-08 21:57:09

JNI C向Java返回对象数组的相关文章

Android中关于JNI 的学习(三)在JNI层访问Java端对象

前面两篇文章简单介绍了JNI层跟Java层的一些对应关系,包括方法名,数据类型和方法名称等,相信在理论层面,能够很好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步的认识,由于表达能力或者理解还是有限,有些地方讲得不是很清楚,如果各位朋友有觉得云里雾里,欢迎大家留言一起学习. 概念上的理解有助于我们更好地认识JNI,而一些实际点的例子则能够更好地帮我们从代码上去掌握并应用JNI. 在第一篇文章,我们是从一个小例子来入门学习的,在其中,我们通过JNI层函数返回

Java类对象数组声明和初始化

Java是纯面向对象语言.类是其重要构成单位. 然后,在实际编程中,我们会自己定义一些类,如Point <span style="font-size:14px;">public class Point { public Point(){ Lat=0.0; Lng=0.0; } public double GetLat(){ return Lat; } public double GetLng(){ return Lng; } public void SetLat(doubl

java之对象数组

package com; /**  * 学生类   *  */ public class Student { private String name; private int age; public Student(){} public Student(String name,int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(Stri

Java.17 对象数组

对象数组 数组可以将对象应用作为元素保存.仅仅使用数组和其它类型的对象就可以建立相当复杂度的信息管理结构.例如,一个数组可以包含有多个对象,每个对象又由一组变量和使用这些变量的方法组成,而对象中的变量可能本身又是数组. 当用数组保存对象时,每个元素是一个对象.即一个对象数组实际上是一个对象引用数组. String[] words = new String[5]; 字符串对象可以表示为字符串常量.下面的声明建立了一个verbs数组,并利用若干个String对象数组的初始值对数组进行初始化而初始值表

后台返回对象数组,对象属性相同时,只取一个对象

后台返回的数据: [ {confirmCharge: "0.00", orderId: "--", changeId: "1", realName: "王五", totalConfirmCharge: "0.00",-}, {confirmCharge: "0.00", orderId: "288783482594267136", changeId: "&q

Java 泛型 泛型数组

直接创建泛型数组不能通过编译,而转型对象数组通过编译但是不能在JVM运行 public class ArrayOfGeneric{ static Generic<Integer>[] gia; @SupperssWarnings("unchecked") public static void main(String[] args){ gia = (Generic<Integer>[])new Generic[100]; // 通过类型转换匿名对象 //! gia

JNI/NDK开发指南(五)——访问数组(基本类型数组与对象数组)

转载请注明出处:http://blog.csdn.net/xyang81/article/details/42346165 JNI中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是JNI的基本数据类型,可以直接访问.而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问Java传递给JNI层的数组,必须选择合适的JNI函数来访问和设置Java层的数组对象.阅读此文假设你已经了解了JNI与Java数据类型的映射关系,如果还不了解

使用jni直接访问java对象中的字段

Java类:UserInfo public class UserInfo { static { System.loadLibrary("userinfo"); } // 从JNI中直接访问字段 public String mUserName; public int mUserAge; public long mMoney; public UserInfo() { } public int getUserAge() { return mUserAge; } public native v

Android中关于JNI 的学习(三)在JNI层訪问Java端对象

前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步的认识,因为表达能力或者理解还是有限,有些地方讲得不是非常清楚.假设各位朋友有认为云里雾里,欢迎大家留言一起学习. 概念上的理解有助于我们更好地认识JNI.而一些实际点的样例则可以更好地帮我们从代码上去掌握并应用JNI. 在第一篇文章,我们是从一个小样例来入门学习的,在当中,我们通过JNI层函数返回