我是否必须创建Java本机接口(JNI)才能从Android的本机原生模块访问C或C代码?
我的目标是在支持 both Android和iOS的react-native Native Module 中重用常见的C和C算法(非UI) . 从Objective C * .m模块调用C或从Objective C * .mm模块调用C很简单 . 但是,Android的react-native Native Module 实现了java中的 Native Module 代码 .
https://facebook.github.io/react-native/docs/native-modules-android.html#content
Android NDK允许您使用C或C编写Android代码 . Android NDK适用于C++ frameworks such as Qt 5.6 . 我不明白如何在避免使用Java JNI的同时将javascript转换为本机Native模块?
提前感谢任何提示或方向,
3 回答
我最近不得不在React Native项目中执行此操作,如果不使用JNI,我无法找到解决方法 . 为此,您必须为JS到Java桥构建代码,然后为Java到C(通过JNI)桥构建更多代码,然后再返回JS .
如果你很容易,因为JNI可以处理类型转换,例如在C中使用Java int到jint(这是一个int typedef),但是如果你有很多初始设置和无聊的代码,但是一旦你开始并习惯它's not that difficult. The JNI Spec is great for reference, it just doesn'告诉你应该如何使用它 .
我有一个github project使用JNI来传递一些示例类 . 这个blog article解释了JNI的所有设置步骤,如果您对此感到满意,它会在"Real World JNI"部分中进入脏的细节 . 如果您对此有任何疑问,请与我们联系!
如果你愿意做一些额外的工作,你可以使用Djinni .
该项目为Objective-C和Java生成接口绑定 . 为C创建包装器代码后,可以创建与React Native集成的Java和Objective-C类 . 因此,React将调用将调用C的Obj-C / Java . 利润 .
很高兴看到这对你有什么用,我还没见过有人这样做过 .
正如https://stackoverflow.com/a/36693929/1925631所提到的,你可以使用Djinni,甚至还有一个用于反应的叉子https://github.com/sulewicz/djinni-react-native/tree/master/example-react-native/ExampleProject