我正在开发一个 android 项目(一个 3d 实时应用程序)并且想使用我编写的 c++ 库。因为它依赖于模板,所以我正在寻找一个很好的解决方案来围绕它编写 Java 包装器。
我的一个想法是在创建对象时在 JNI 调用中包含 java 类名。例如,我像这样实例化一个 Java 类:
//java
A a = new A(Integer.class());
//jni call
if(strcmp("java.lang.integer", className) == 0) return (jlong) new A<int>();
else if(strcmp("java.lang.float", className) == 0) return (jlong) new A<float>();
else if( .... )
这个解决方案的问题是,每当我想使用新的数据类型时,我都必须添加另一个 elseif 代码块并再次编译 C++ 代码。
最佳答案
The problem with this solution is, that whenever I want to use a new data type I have to add another elseif code block.
请记住,Java 中只有 8 种原始类型。如果您为其中每一个添加一个 if-else,您将能够处理任何基本类型参数。
如果您还为 jobject
添加了一个案例,您还可以使用它来处理任何 对象类型。请小心正确处理 JNI 对象引用。
关于适用于 Android 的 Java C++ 包装器 : how to wrap c++ templates ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451025/