Android:如何将自定义对象的数组列表传递给c++代码,并使用JNI在Java代码中获得这些对象的操纵数组列表

Android: How to pass an ArrayList of custom object to C++ code and get the manipulated ArrayList of those objects in Java code using JNI

本文关键字:数组 列表 代码 对象 JNI 操纵 Java c++ 自定义 Android      更新时间:2023-10-16

我正在制作一个Android应用程序,我希望一些功能用c++编写,并使用JNI进行通信。为此,我想通过传递自定义对象的ArrayList来调用c++函数。

示例:

public class Student{
    String name;
    String class;
    int score;
}
...
public native ArrayList<Student> manipulateScore(ArrayList<Student>);
....
c++代码:

JNIEXPORT ?ArrayList<Student>? JNICALL Java_com_packagename_ProjectName_MainActivity_manipulateScore(JNIEnv* env, jobject ob, ?ArrayList<STudent>?){
    //to traverse Arraylist<Student> and access Student.score member...
}

应该用什么来代替?我如何得到这个数组列表并遍历它在我的c++代码?

谢谢你的帮助!

在c++代码中使用JNI操作ArrayList是可能的,但如果您传递一个简单的对象数组,您将使自己更容易:

public native void manipulateScore(Student[] students);

(也可以声明为Object[] students)

调用函数时使用ArrayList类的toArray()方法。

然后在c++代码中,你可以将参数声明为jobjectArray

JNIEXPORT void JNICALL Java_com_packagename_ProjectName_MainActivity_manipulateScore(JNIEnv* env, jobject ob, jobjectArray students)

然后您可以使用JNI函数来操作对象数组,如getObjectArrayElement来操作数组,而不必查找方法id并调用ArrayList访问器函数,这要复杂得多。

您可以在适当的位置操作数组(在这种情况下,返回值可以是void,或者成功/失败代码),或者返回使用newObjectArray创建的新对象数组。