简单地迁移你的android jni代码逻辑到iOS - 编写iOS下jni.h的替代 - ocni.h

Posted bbqz007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单地迁移你的android jni代码逻辑到iOS - 编写iOS下jni.h的替代 - ocni.h相关的知识,希望对你有一定的参考价值。

1. jni的代码逻辑中与上层平台语言交互了。

2. 使用非Xcode的ide开发工具,希望使用纯净的c/c++代码,不掺杂其它平台相关的语言语法。

3. 只想简单地替换jni代码对上层平台语言的功能调用。

对了,本文就是这样一个出发点。

 

先说一下jni.h头文件是为jni代码(c/c++)去使用java平台层的对象(功能)提供的c或c++接口集。如果在ios平台OC层的生态环境下比较容易就可以实现同样功能的java对象,你的jni代码就不用去改变逻辑,只要将向java平台层访问的地方改成对同等功能的OC对象就可以了。但是你又不想用OC语法写m代码文件,没错你get到了,将jni.h替换成ocni.h就可以了,我要的就是ocni.h。

 

在jni.h接口文件中,最常使用到的就是访问java对象的方法,自省,引用这些接口,分别是Call##RtnType##Method(jobject, jmethodId, ...),FindClass(const char*),NewLocalRef,DeleteLocalRef等,把这些一一用OC运行时和CF库搞定之。

 

先来看Call##RtnType##Method(jobject, jmethodId, ...)这个原型怎么看起来这么的熟悉,不就是objc_msgSend(id, SEL, ...),这样一来就不用方括号语法了。

再来看自省相关的FindClass,getObjectClass,instanceOf等,Foundation里的NSObject接口不是有-[NSObject class]和-[NSObject isKindOfClass:],运行时不是有objc_getClass等。

第三就是引用相关的接口,java层是gc管理的,对象new出来后就不用去delete,release,这不就是OC的ARC模式吗。但是在jni代码,必须使用jni.h的接口来手动管理引用的计数。也就是你的jni代码迁移过iOS平台是在MRC模式下的,对应完成Retain/Release。

最来就是弱引用了,我们的目标是迁移过程不加入OC特性的关键字,如__weak,__strong,__bridge等(这些在MRC是空气)。但是__weak只能在ARC模式下使用,这也没问题,只要你明白llvm在编译时为ARC的__weak关键字做了什么,就可以去用运行时的c接口函数来完成同样的工作,但很不幸,这些函数你可以在运行时的源代码项目中看到,但却不是向外的函数,所以使用不了。这也难不倒,java中弱引用不依赖编译,而是一个WeakReference对象,我也来一个OCWeakReference类,由它来运行在ARC模式搞定。

最后还有就是jstring, jarray一概用CF类来取代之。

 

代码上传到了https://github.com/bbqz007/xw上。

ocni.h

ocni.cpp

OCWeakReference.h

OCWeakReference.m

以上是关于简单地迁移你的android jni代码逻辑到iOS - 编写iOS下jni.h的替代 - ocni.h的主要内容,如果未能解决你的问题,请参考以下文章

Android中关于JNI 的学习(零)简单的样例,简单地入门

eclipse JNI项目迁移android studio相关问题

[Android][Android Studio] Gradle项目中添加JNI生成文件(.so文件)

关于JNI调用从eclipse转到Android Studio遇到的问题(总结)

Android中关于JNI 的学习简单的样例,温故而知新

Android中关于JNI 的学习简单的样例,温故而知新