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的更多相关文章

  1. 10.4 android输入系统_框架、编写一个万能模拟输入驱动程序、reader/dispatcher线程启动过程源码分析

    1. 输入系统框架 android输入系统官方文档 // 需FQhttp://source.android.com/devices/input/index.html <深入理解Android 卷 ...

  2. 黑客破译android开发代码真就那么简单?

    很多程序员辛辛苦苦开发出的android开发代码,很容易就被黑客翻译了. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了 ...

  3. 教会你彻底解决android studio c/c++ jni代码无法跳转

    时不时总会遇到原来c c++ jni代码跳转很欢乐,突然也不知道咋滴了build也能build成功,运行也能正常运行,就是代码不能跳转了,首先来科普下一些背景知识. 如果让代码跳转起来,大概需要做哪些 ...

  4. [Android] Linux下JNI简单实现过程

    大概梳理了一下JNI的过程: start->先写好A.java文件,里面添加native方法B,调用库C.so->编译成.class文件->用javac生成.h文件,文件包含Java ...

  5. Android Native 代码NDK开发学习笔记

    引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...

  6. JNI技术基础(2)——从零开始编写JNI代码

    书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...

  7. JNI技术基础(1)——从零开始编写JNI代码

    众所周知,Java程序的最大特点就是其跨平台的特性,编写的上层应用程序可以不加任何修改甚至不用重新编译而运行于不同的平台上,然而,Java本身也存着这一个弊端,那就是性能上相对要差一些,在对性能要求比 ...

  8. 从eclipse到Android studio/迁移eclipse的Android项目到Android studio平台的注意事项

    整体要注意的地方 先说明一下整体需要注意的地方 1在Android studio建立项目的时候,要注意包名和原来的完全一致,不然会有很多需要改动. 2依赖的jar一定一定要找齐,不然新建项目引用不到, ...

  9. android开源代码

    Android开源项目--分类汇总 转自:https://github.com/Trinea/android-open-project Android开源项目第一篇——个性化控件(View)篇 包括L ...

随机推荐

  1. MySQL常用sql语句-----数据库操作

    在数据库操作中,操作基本都是围绕增删改查来操作.简称CRUD C创建创建 R读取/检索查询 U Update修改 D删除删除 在数操作数据库时,所有的数据库语句都要以分号结束 数据库操作不区分大小写 ...

  2. 关于托福改革后的难度、评分和拼分,听听ETS的老师怎么说

    “笔者有幸于几天前去到ETS位于普林斯顿的总部学习,聆听了他们关于托福考试的发展和变革的说明,在这里向大家汇报一下此行的收获.” 当从车上下来那一刻起,我们便被那辽阔的绿草地和宜人的风景所吸引,伴随着 ...

  3. Qualcomm-Atheros-QCA9377-Wifi-Linux驱动

    资源来自:https://download.csdn.net/download/ichdy/10331646 已经下载好了,发现无法使用,本人系统Centos7.2,如果有安装成功,并且可以正常使用的 ...

  4. SpringBoot学习(三)探究Springboot自动装配

    目录 什么是自动装配 何时自动装配 原理分析 注:以下展示的代码springboot的版本为2.0.3版.因源码过长,大家选择展开代码 ㄟ( ▔, ▔ )ㄏ 什么是自动装配 自动装配还是利用了Spri ...

  5. 为什么说HttpMessageConverter的顺序非常重要_SpringBoot

    问题描述 系统内配置了,ProtobufJsonFormatHttpMessageConverter和FastJsonHttpMessageConverter. Spring官方内置的默认Messag ...

  6. 本地客户端(自己的电脑)连接远程Oracle数据库(服务器端),客户端安装步骤

    如果本地自己的电脑没有安装Oracle(服务器端数据库),那就要单独安装HA-Instant Client-v11.2.0.3.0.exe(oracle_client客户端) 如果本地安装了Oracl ...

  7. 写出float x 与“零值”比较的if语句——一道面试题分析

    写出float  x 与“零值”比较的if语句 请写出 float  x 与“零值”比较的 if 语句: const float EPSINON = 0.00001; if ((x >= - E ...

  8. leetcode算法小题(1)

    题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...

  9. SpringBoot 整合 Elasticsearch深度分页查询

    es 查询共有4种查询类型 QUERY_AND_FETCH: 主节点将查询请求分发到所有的分片中,各个分片按照自己的查询规则即词频文档频率进行打分排序,然后将结果返回给主节点,主节点对所有数据进行汇总 ...

  10. mysql分组和去重同时使用

    这是我的数据结构: 这是我的统计SQL