JNI提供了很多API用来传递对象从JAVA到C, 一般比较普通的就是传递原始类型,或者String,如果传递的对象中包含其他类型的对象,过程就有点复杂了。先上代码吧.
public class Container { private String hello; private Map<String, String> parameterMap = new HashMap<String, String>(); public Map<String, String> getParameterMap() { return parameterMap; } }
这个对象包括两个属性,hello和parameterMap,hello是String类型的,而parameterMap是一个Map类型的。
使用native的方法类传递:
public class MyClazz { public doProcess() { Container container = new Container(); container.getParameterMap().put("foo","bar"); manipulateMap(container); } public native void manipulateMap(Container container); }
这里将Container对象作为参数,他的实现是在底层的C代码中完成的:
JNIEXPORT jint JNICALL Java_MyClazz_manipulateMap(JNIEnv *env, jobject selfReference, jobject jContainer) { // initialize the Container class jclass c_Container = (*env)->GetObjectClass(env, jContainer); // initialize the Get Parameter Map method of the Container class jmethodID m_GetParameterMap = (*env)->GetMethodID(env, c_Container, "getParameterMap", "()Ljava/util/Map;"); // call said method to store the parameter map in jParameterMap jobject jParameterMap = (*env)->CallObjectMethod(env, jContainer, m_GetParameterMap); // initialize the Map interface jclass c_Map = env->FindClass("java/util/Map"); // initialize the Get Size method of Map jmethodID m_GetSize = (*env)->GetMethodID(env, c_Map, "size", "()I"); // Get the Size and store it in jSize; the value of jSize should be 1 int jSize = (*env)->CallIntMethod(env, jParameterMap , m_GetSize); // define other methods you need here. }
上面的代码没有完成,不过可以顺利得到HashMap的size. 如果需要遍历这个HashMap,还可以调用HashMap的其他方法。
这里需要注意的是,如果传递的object里面有非原始类型的数据类型,就需要做一些转换,转换成C能认识的类型。可以通过
jclass c_Map = env->FindClass("java/util/Map");
这个方法就是在C层获得一个Map的类型,然后我们可以得到这个类相应的方法:
jmethodID m_GetSize = (*env)->GetMethodID(env, c_Map, "size", "()I");
然后去调用它:
int jSize = (*env)->CallIntMethod(env, c_Map, m_GetSize);
如果希望返回一个Java层的对象,也可以使用这个方法,是不是很简单。。。。
相关推荐
JNI处理hashmap,string等对象的操作,别处绝对没有的
这是我自己写的jni中java传递对象到c里面
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:...Java传递List集合对象到C/C++ https://blog.csdn.net/niuba123456/article/details/80994168
文档里描述了如何通过jni方法在java与c++代码之间传递非基本类型数据
含HashMap, byte数组,String其它的类似。 测试环境 eclipse 3.4 mingw 5.16 注意加上链接参数g++ -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at cdt 5 jdk 5
android jni 传递对象的demo,展示了如何在java与C之间传递对象。详细介绍见相关博客。
jni对象获取,使用jni从c++里获取Java对象
JNI 各种参数传递,基本数据类型,自定义对象,系统对象
可在jni层返回应用层一个对象数组,包括字符串、整数、小数的成员变量
这是我用于测试,主要用于jni创建java对象病操作
实现了jni 中java向vc dll传递list参数/String参数 对象的接口。vc代码可用vc6.0运行编译,java调用接口在src\common\CameraUtil.java里面。测试了好久才实现的(涉及到项目机密,部分资源文件没有上传,内部方法是...
Java通过JNI和c++对象数据的传递和对象的返回
在java中调用jni中返回的对象或对象数组,即相当于helloword
world 文档,描述了Android g1环境,C、Java、JNI调用(C调Java、Java调C)基本运算、方法调用、字符串连接的效率测试结果。
JNI中C和Java参数传递详细例子,各种数据类型,基本类型,数据,结构体,DEMO,非常适合初学者,一看就明,详细例子
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
Android studio JNI函数以及复杂对象传递
本文件是 JNI 传递和返回基本参数的 Demo,详细介绍见博客:https://blog.csdn.net/u011520181/article/details/79765336,无法资源分设置 0 分,也可以去博客下面的 github 地址下载
3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是bytearray的话,作如下处理得到buffer: 58 VIII. C/C++调用...
这是一个简单的JNI开发中C层调用Java层函数的事例工程,对应的博客地址是:http://blog.csdn.net/hty1053240123/article/details/52126386