使用JAVA JNI和C++进行泛型调用

dcm*_*vva 3 c++ java generics java-native-interface

我正在使用JNI,我必须将一些泛型类型传递给C++.我坚持如何在C++方面处理这个问题

HashMap<String, Double[]> data1 ; 
ArrayList<ArrayList<String>> disc ;
Run Code Online (Sandbox Code Playgroud)

我是JNI的新手,环顾四周但找不到多少帮助.有人可以帮助我如何为此编写JNI代码.任何对网上资料的提及也会非常有帮助.

lui*_*nal 8

简答:你做不到.

答案很长:类型擦除:http://download.oracle.com/javase/tutorial/java/generics/erasure.html

考虑一个参数化的实例ArrayList<Integer>.在编译时,编译器会检查您是否Integer在数组列表实例中放置了与其兼容的东西.

但是,也是在编译时(以及语法检查之后),编译器剥离了类型参数,渲染ArrayList<Integer>Arraylist<?>等效ArrayList<Object>或简单ArrayList(如在JDK之前5次).

后一种形式是JNI所期望的(由于历史原因以及由于Java中实现泛型的方式...再次,键入擦除.)

记住,一个ArrayList<Integer>是a ArrayList.因此,您可以将ArrayList<Integer>JNI 传递给JNI ArrayList.相反的情况并不一定如此,因为您可能会从JNI中获得一些与您的参数化的通用算法不兼容的东西.

此时,您正在跨越类型化,参数化域(您的泛型)和无类型域(JNI)之间的障碍.你必须很好地封装那个障碍,你必须添加胶水代码和错误检查/错误处理代码来检测何时/如果事情不能很好地转换.


Eri*_*rik 6

运行时的签名只是普通HashMapArrayList-泛型是编译时的事情.

您可以使用javah生成具有正确的本机功能签名的C头文件.