简单地迁移你的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的更多相关文章
- 10.4 android输入系统_框架、编写一个万能模拟输入驱动程序、reader/dispatcher线程启动过程源码分析
1. 输入系统框架 android输入系统官方文档 // 需FQhttp://source.android.com/devices/input/index.html <深入理解Android 卷 ...
- 黑客破译android开发代码真就那么简单?
很多程序员辛辛苦苦开发出的android开发代码,很容易就被黑客翻译了. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了 ...
- 教会你彻底解决android studio c/c++ jni代码无法跳转
时不时总会遇到原来c c++ jni代码跳转很欢乐,突然也不知道咋滴了build也能build成功,运行也能正常运行,就是代码不能跳转了,首先来科普下一些背景知识. 如果让代码跳转起来,大概需要做哪些 ...
- [Android] Linux下JNI简单实现过程
大概梳理了一下JNI的过程: start->先写好A.java文件,里面添加native方法B,调用库C.so->编译成.class文件->用javac生成.h文件,文件包含Java ...
- Android Native 代码NDK开发学习笔记
引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...
- JNI技术基础(2)——从零开始编写JNI代码
书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...
- JNI技术基础(1)——从零开始编写JNI代码
众所周知,Java程序的最大特点就是其跨平台的特性,编写的上层应用程序可以不加任何修改甚至不用重新编译而运行于不同的平台上,然而,Java本身也存着这一个弊端,那就是性能上相对要差一些,在对性能要求比 ...
- 从eclipse到Android studio/迁移eclipse的Android项目到Android studio平台的注意事项
整体要注意的地方 先说明一下整体需要注意的地方 1在Android studio建立项目的时候,要注意包名和原来的完全一致,不然会有很多需要改动. 2依赖的jar一定一定要找齐,不然新建项目引用不到, ...
- android开源代码
Android开源项目--分类汇总 转自:https://github.com/Trinea/android-open-project Android开源项目第一篇——个性化控件(View)篇 包括L ...
随机推荐
- Mac系统 安装Photoshop CC 2018破解版
应用场景 本人从事前端行业,但是工作中有时也需要会点PS技能,之前一直使用window系统,突然换了Mac其他软件基本都差不多安装完了,就剩下比较难搞的PS.刚开始按照网上乱七八槽的教程下载过好多次都 ...
- myeclipse 在web-inf/lib中导入包
今天用myeclipse的时候发现无法在web-inf/lib导入包,如果直接在工程上导入,则进入了一个referenced libraries的文件夹里,而web-inf/lib里面是没有jar包的 ...
- Java基础(四)注释
1.类注释 类注释必须放在import语句之后,类定义之前.eclipse中使用Shift + Alt + J快捷键添加类注释. 2.方法注释 每一个方法注释必须放在所描述的方法之前.除了通用标记之外 ...
- tomcat的虚拟路径的配置
在一些项目中有时候需要把一些文件(例如图片.视频)存储在硬盘上的,如果是把文件在放在硬盘上的话,怎么才能访问到这些文件昵. 好了.下面就为大家讲讲如何利用tomcat 虚拟路径访问硬盘上的文件.总共有 ...
- Element-ui-安装
1.node环境安装 1.1.根据自己电脑位数,下载最新版node.js并安装https://nodejs.org/en/ 1.2.下载git并安装https://gitforwindows.org/ ...
- kali linux 开启配置ssh服务
1. 一.配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#PasswordAuthentication no的注释去掉,并且将NO修 ...
- IDEA复制多行及对多行代码上下左右移动
复制: 复制一行可不需要选中 多行需要选中 mac:command+D window:ctrl+D 移动: 选中代码 左移:tab+shift 右移:tab 上移:shift+alt+向上方向键 下移 ...
- 真正的打包scrapy单文件(不包含cfg)
前置:https://www.cnblogs.com/luocodes/p/11827850.html 解决最后一个问题,如何将scrapy真正的打包成单文件 耗了一晚上时间,今天突然有灵感了 错误分 ...
- nginx篇中级用法之反向代理(七层调度)
环境: 两台后端web,一台代理服务器 web1:eth0:192.168.2.100/24 httpd做一个web web2:eth0:192.168.2.200/24 httpd做一个we ...
- [考试反思]1102csp-s模拟测试98:苟活
好像没有什么粘文件得分的必要(本来就没多少分了也丢不了多少了) 而且从这次开始小绿框不代表首杀而代表手速了2333 其实我挺菜的,牛一个frepoen送掉100分才跟我并列%%%milkfun mik ...