`
david_je
  • 浏览: 373851 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JNI如何传递一个HashMap对象从java到C

 
阅读更多

           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等对象的操作

    对于String对象的处理,JNI提供了`NewStringUTF`函数来创建一个新的Java String对象,以及`GetStringUTFChars`和`ReleaseStringUTFChars`来获取和释放字符串的UTF-8表示。例如,你可能需要在本地代码中解析或修改...

    JNI处理各种类型数据,不包含获取Java的HashMap

    本资源包含了一个关于JNI处理各种类型数据的实例,但不涉及如何从JNI获取Java的HashMap。 在JNI中,处理数据类型主要分为两步:声明和实现。首先,你需要在Java层声明native方法,并使用`JNIEXPORT`和` JNICALL`...

    一个很菜的 Java 作业.zip

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。"一个很菜的 Java 作业.zip"这个压缩包文件显然包含了...对于初学者来说,这是一个很好的起点,不断实践和总结,逐渐就能从“菜”到精通。

    JAVA语言入门资料

    这份“JAVA语言入门资料”旨在为新手提供一个系统化的学习路径,帮助他们快速掌握JAVA的基础知识和核心概念。 一、JAVA语言概述 JAVA是一种面向对象的、跨平台的编程语言,由Sun Microsystems公司(现已被Oracle...

    java-ppt.rar_java .ppt_java ppt_java基础 ppt_java基础 ppt_ppt jav

    "java-ppt.rar"可能是一个包含Java基础知识的演示文稿,旨在帮助初学者理解和掌握Java编程。"java .ppt"和"java ppt"是可能的PPT文件名,它们通常用于结构化教学,将复杂的编程概念分解成易于理解的步骤和示例。 在...

    JAVA开发压缩文件

    这些教程覆盖了JAVA开发的多个方面,从基础的JDBC和JNI到集合框架的算法,再到J2EE的实践,对于一个JAVA初学者来说,这是一个全面且深入的学习资源包。通过这些材料,读者可以系统地学习JAVA开发,并逐步提高自己的...

    java高级 初级 中级 教程

    再者,JNI(Java Native Interface)允许Java代码调用C或C++原生代码,这在需要高性能计算或者集成已有的原生库时非常有用。 高级Java还涵盖了Spring框架,这是一个广泛使用的开源框架,用于简化企业级应用的开发。...

    达内core_java学习笔记

    封装是将数据和方法打包到一个类中,保护数据的安全性。继承允许子类继承父类的属性和方法,实现代码重用。多态则是同一接口可以有多种不同的实现方式,提高了灵活性。 三、类与对象 在Java中,类是对象的蓝图,而...

    有关java课程讲义

    这份讲义包含了十几个章节,这意味着它将涵盖广泛的主题,从Java语法基础到面向对象编程、异常处理、集合框架、多线程、网络编程以及可能的高级特性,如反射和JNI。 首先,讲义的初期章节可能介绍Java环境的搭建,...

    Java面经.适用于校招

    - 快速失败机制检测到另一个线程在修改集合时会立即抛出ConcurrentModificationException。 - 安全失败机制则是通过创建集合的副本来进行迭代。 三.锁 Java提供了多种机制来控制多线程对共享资源的并发访问。 3.1...

    JAVA學習手冊

    8. **JNI与JVM**:了解JAVA本地接口(JNI)和虚拟机(JVM)的工作原理,如何通过JNI调用C/C++代码。 9. **JAVA高级特性**:包括枚举(enum)、注解(annotation)、Lambda表达式、Stream API等,这些都是JAVA 8及...

    Java解惑(中文版)_java_java解惑_solve65p_

    14. **JNI(Java Native Interface)**:学习如何在Java中调用C/C++代码,实现Java与其他语言的交互。 通过《Java解惑》这本书,初学者不仅可以系统地学习Java语言,还能获得解决实际问题的技巧,从而更好地适应...

    21 days java

    10. **JNI与JNI接口**:JAVA本地接口,用于调用C/C++库。 11. **JAVA API**:涵盖JAVA标准库中的各种类和接口,如Date、Calendar、Math等。 12. **JDBC**:JAVA数据库连接,用于与数据库进行交互。 13. **Swing与...

    传智播客Java培训毕向东Java基础pdf

    14. **反射机制**:反射是Java的一个强大功能,允许在运行时动态获取类的信息并操作类的对象。 15. **JNI(Java Native Interface)**:当需要调用C/C++库或者优化性能时,会用到JNI来实现Java与本地代码的交互。 ...

    黑马java教程知识点笔记整理

    实例化一个类会创建一个对象,通过对象来调用类中的属性和方法。类之间的关系可以是继承、封装和多态,这些都是面向对象编程的核心概念。 【变量与数据类型】 Java有八种基本数据类型:整型(byte、short、int、...

    由浅入深——Java 2自学教程 配书光盘.rar

    Java 2,也被称为Java 2平台标准版(J2SE),是Java语言的一个重要版本,它在Java 1的基础上增加了许多新特性,如多线程、垃圾回收、异常处理和面向对象编程等,为开发者提供了更强大的功能和更灵活的开发环境。...

    小贝程序员生活\课件\java\javaclass\fourteen lesson.rar

    3. **继承**:Java支持单一继承,一个子类可以从一个父类继承其属性和方法。这允许代码重用,减少了冗余,并提高了模块化。 4. **多态性**:多态性意味着同一种行为可以有不同的表现形式,取决于调用它的对象。Java...

    java程序修改环境变量

    在创建`ProcessBuilder`对象时,可以传递一个环境变量映射(Map),覆盖默认的环境: ```java Map, String&gt; env = new HashMap(System.getenv()); env.put("JAVA_HOME", "/path/to/new/jdk"); ProcessBuilder pb...

    164个java完整代码

    这些例子覆盖了Java编程的各个方面,从基本语法到高级特性,都是经过精心挑选和验证的,确保了内容的全面性和权威性。 1. **基本语法**:Java的基础包括变量声明、数据类型(如整型、浮点型、字符型、布尔型)、...

    Java实现vimJava实现的vimdemo

    3. **JNI(Java Native Interface)**:由于Vim原生支持许多复杂的文本处理和编辑命令,如果要在Java中实现类似的功能,可能需要通过JNI调用C或C++编写的库,尤其是涉及到终端控制和文本模式交互的部分。 4. **GUI...

Global site tag (gtag.js) - Google Analytics