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层的对象,也可以使用这个方法,是不是很简单。。。。
相关推荐
对于String对象的处理,JNI提供了`NewStringUTF`函数来创建一个新的Java String对象,以及`GetStringUTFChars`和`ReleaseStringUTFChars`来获取和释放字符串的UTF-8表示。例如,你可能需要在本地代码中解析或修改...
本资源包含了一个关于JNI处理各种类型数据的实例,但不涉及如何从JNI获取Java的HashMap。 在JNI中,处理数据类型主要分为两步:声明和实现。首先,你需要在Java层声明native方法,并使用`JNIEXPORT`和` JNICALL`...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。"一个很菜的 Java 作业.zip"这个压缩包文件显然包含了...对于初学者来说,这是一个很好的起点,不断实践和总结,逐渐就能从“菜”到精通。
这份“JAVA语言入门资料”旨在为新手提供一个系统化的学习路径,帮助他们快速掌握JAVA的基础知识和核心概念。 一、JAVA语言概述 JAVA是一种面向对象的、跨平台的编程语言,由Sun Microsystems公司(现已被Oracle...
"java-ppt.rar"可能是一个包含Java基础知识的演示文稿,旨在帮助初学者理解和掌握Java编程。"java .ppt"和"java ppt"是可能的PPT文件名,它们通常用于结构化教学,将复杂的编程概念分解成易于理解的步骤和示例。 在...
这些教程覆盖了JAVA开发的多个方面,从基础的JDBC和JNI到集合框架的算法,再到J2EE的实践,对于一个JAVA初学者来说,这是一个全面且深入的学习资源包。通过这些材料,读者可以系统地学习JAVA开发,并逐步提高自己的...
再者,JNI(Java Native Interface)允许Java代码调用C或C++原生代码,这在需要高性能计算或者集成已有的原生库时非常有用。 高级Java还涵盖了Spring框架,这是一个广泛使用的开源框架,用于简化企业级应用的开发。...
封装是将数据和方法打包到一个类中,保护数据的安全性。继承允许子类继承父类的属性和方法,实现代码重用。多态则是同一接口可以有多种不同的实现方式,提高了灵活性。 三、类与对象 在Java中,类是对象的蓝图,而...
这份讲义包含了十几个章节,这意味着它将涵盖广泛的主题,从Java语法基础到面向对象编程、异常处理、集合框架、多线程、网络编程以及可能的高级特性,如反射和JNI。 首先,讲义的初期章节可能介绍Java环境的搭建,...
- 快速失败机制检测到另一个线程在修改集合时会立即抛出ConcurrentModificationException。 - 安全失败机制则是通过创建集合的副本来进行迭代。 三.锁 Java提供了多种机制来控制多线程对共享资源的并发访问。 3.1...
8. **JNI与JVM**:了解JAVA本地接口(JNI)和虚拟机(JVM)的工作原理,如何通过JNI调用C/C++代码。 9. **JAVA高级特性**:包括枚举(enum)、注解(annotation)、Lambda表达式、Stream API等,这些都是JAVA 8及...
14. **JNI(Java Native Interface)**:学习如何在Java中调用C/C++代码,实现Java与其他语言的交互。 通过《Java解惑》这本书,初学者不仅可以系统地学习Java语言,还能获得解决实际问题的技巧,从而更好地适应...
14. **反射机制**:反射是Java的一个强大功能,允许在运行时动态获取类的信息并操作类的对象。 15. **JNI(Java Native Interface)**:当需要调用C/C++库或者优化性能时,会用到JNI来实现Java与本地代码的交互。 ...
10. **JNI与JNI接口**:JAVA本地接口,用于调用C/C++库。 11. **JAVA API**:涵盖JAVA标准库中的各种类和接口,如Date、Calendar、Math等。 12. **JDBC**:JAVA数据库连接,用于与数据库进行交互。 13. **Swing与...
实例化一个类会创建一个对象,通过对象来调用类中的属性和方法。类之间的关系可以是继承、封装和多态,这些都是面向对象编程的核心概念。 【变量与数据类型】 Java有八种基本数据类型:整型(byte、short、int、...
Java 2,也被称为Java 2平台标准版(J2SE),是Java语言的一个重要版本,它在Java 1的基础上增加了许多新特性,如多线程、垃圾回收、异常处理和面向对象编程等,为开发者提供了更强大的功能和更灵活的开发环境。...
3. **继承**:Java支持单一继承,一个子类可以从一个父类继承其属性和方法。这允许代码重用,减少了冗余,并提高了模块化。 4. **多态性**:多态性意味着同一种行为可以有不同的表现形式,取决于调用它的对象。Java...
在创建`ProcessBuilder`对象时,可以传递一个环境变量映射(Map),覆盖默认的环境: ```java Map, String> env = new HashMap(System.getenv()); env.put("JAVA_HOME", "/path/to/new/jdk"); ProcessBuilder pb...
这些例子覆盖了Java编程的各个方面,从基本语法到高级特性,都是经过精心挑选和验证的,确保了内容的全面性和权威性。 1. **基本语法**:Java的基础包括变量声明、数据类型(如整型、浮点型、字符型、布尔型)、...
3. **JNI(Java Native Interface)**:由于Vim原生支持许多复杂的文本处理和编辑命令,如果要在Java中实现类似的功能,可能需要通过JNI调用C或C++编写的库,尤其是涉及到终端控制和文本模式交互的部分。 4. **GUI...