码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2016-08-29 00:04:39      阅读:531      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://www.cnblogs.com/bbqzsl/p/5816342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!