JNI开发之旅
带你走进JNI世界
阁楼猫
这个作者很懒,什么都没留下…
展开
-
[JNI] 开发实例(2) 编译libwebsocket,封装jni函数,搭建IM通信基础服务
WebSocket协议是基于TCP的一种新的协议。WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符。它实现了浏览器与服务器全双工(full-duplex)通信。这段介绍来自百科。当然websocket也可以用于android建立长链接,实现IM通信 优势:节省内存空间。当然这个是服务端并发时候节省内存空间,支持的并发量更大 ,这个我没做服务端没有验证原创 2017-04-08 16:55:00 · 5897 阅读 · 6 评论 -
[JNI]开发实例(1)封装libjpeg库 保证图片质量压缩图片
为什么libjpeg这么好用,这里不做介绍了,自行去搜索很多blog有介绍,也可以反编译微信,淘宝等大厂app,你都会发现libjpeg.so的身影。直接上代码撸环境: android studio 2.2.3下载编译好的libjpeg.so当然你也可以下载libjpeg.a静态文件,然后把你的jni与这个.a打成一个so库; 这里为了方便就直接下载github上编译好的so文件了,你也可以尝试原创 2017-03-04 15:45:21 · 2570 阅读 · 0 评论 -
[JNI]开发之旅(9)JNI函数字符串处理
通过前面章节接触到字符串类型,知道字符串类型的数据是不能直接操作的。本节来介绍不能操作的原因及操作字符串的一些函数。JNI 把 Java 中的所有对象当作一个C指针传递到本地方法中,这个指针指向 JVM 中的内部数据结构,而内部的数据结构在内存中的存储方式是不可见的。只能从 JNIEnv 指针指向的函数表中选择合适的 JNI 函数来操作 JVM 中的数据结构。前面示例中,访问 java.lang.S原创 2017-01-01 13:43:46 · 2345 阅读 · 0 评论 -
[JNI]开发之旅(8)传递参数给JNI函数
本节将介绍在JNI编程中如何传递参数和返回值。首先要强调的是,native方法不但可以传递Java的基本类型做参数,还可以传递更复杂的类型,比如String,数组,甚至自定义的类。jni.h中定义了很多接口供我们操作。其实在前面章节的例子中,我们已经使用到很多java传递参数给jni的例子,只是没有重点介绍,接下来会对传递几种基本类型参数,string,数组,java自定义对象这些参数介绍。1. 基原创 2017-01-01 00:34:14 · 3511 阅读 · 0 评论 -
[JNI]开发之旅(7)JNI函数中调用java对象的方法
在jni函数中我们不仅要对java对象的数据域进行访问,而且有时也需要调用java中类对象已经实现的方法。接下来我们对对象的方法调用,调用步骤与访问数据域相似。1.获得实例对应的class类2.根据class类获得方法的method id3.根据method id和对象实例获取方法4.操作方法实例1:JNI方法java对象public方法java代码 定义一个setSex方法,通过acces原创 2016-12-31 20:51:46 · 5151 阅读 · 1 评论 -
[JNI]开发之旅(6)JNI函数中访问java类中对象的属性
JNI函数的实现在c/c++中实现的,如果想访问java中定义的类对象的实例域需要三个步骤:1.通过GetObjectClass()函数获得该对象的类class,返回值是一个jclass; 2.调用GetFieldID函数得到需要访问的实例域(变量)在该c类中id 3.调用Get【Type】Field()得到访问的变量值。其中【Type】对应变量的类型。 例如:java中有一个int a...原创 2016-12-25 12:28:28 · 3736 阅读 · 2 评论 -
[JNI]开发之旅(5)访问c/c++函数
前面介绍了那么多,不在废话,直接实例开撸,不懂步骤的请看: [JNI]开发之旅(1)开发流程介绍调用C++函数1.调用c++函数printf,输出一个hello JNIjava层: 定义一个JNIUtilsclass JNIUtils{ public native void printC(); static{ System.loadLibrary("native-l原创 2016-12-24 20:33:14 · 1224 阅读 · 0 评论 -
[JNI]开发之旅(4)项目架构介绍
前面介绍了一个系列的c语言基础及jni相关类型字符定义,现在开始进入JNI开发主题。 首先,看一下项目的体系架构。项目分为3个部分:java部分,c/c++部分,以及一个makefile文件。java部分:定义native方法,并加载动态连接库,当然还有我们项目的源码,class文件,res资源等。c/c++部分:包括.c或.cpp文件以及.h头文件,在.c/.cpp文件中实现java层中定义的n原创 2016-12-24 19:16:26 · 1275 阅读 · 0 评论 -
[JNI]开发之旅 (3)jni域描述符说明
域描述符类描述符方法描述符前面一节介绍到相关数据类型映射,接下来介绍下描述符1.域描述符1、基本类型的描述符 java类型 feild描述 byte B char C short S int I long J float F double D boolean Z域描述符比较容易记,除long(J),boolean(Z)例外,其原创 2016-12-24 18:56:35 · 1822 阅读 · 0 评论 -
[JNI] 开发之旅 (2)解释jni helloworld实例
在上篇文章中已经介绍完jni开发的流程,实现了一个简单的hello world实例 接下来对这个实例中出现的关键词,函数进行解释。.h头文件通过javah生成的头文件//引入jni.h文件#include "jni.h"/* Header for class com_honjane_jni_HelloJni *///如果没有定义xxx ifndef后会成对跟上define#ifndef _原创 2016-12-18 11:04:39 · 797 阅读 · 0 评论 -
[JNI] 开发之旅 (1)开发流程介绍
通过上一个系列对c语言的熟悉,为jni开发打下基础,接下来就正式进入jni开发。JNI概念(Java Native Interface )java本地化接口 , 可以通过JNI调用系统提供的API , 我们知道不管什么类型操作系统 , 机器最终识别的是一些二进制码。而 java和C/C++不同 , 它不会直接编译成机器码,而是编译成虚拟机可以运行的java字节码的.class文件,通过JIT技术即时原创 2016-12-17 23:05:37 · 1537 阅读 · 0 评论 -
[JNI] 开发基础 (8)c语言typedef
typedef 起别名,目的是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:struct stu stu1;struct 看起来就是多余的,但不写又会报错。如果为 struct stu 起了一个别名 STU,书写起来就简单了:STU stu1;写法更加简练,意义也非常明确,不管是在标准头文件中还是jni的编程实践中,都会大量使用这种别名。语法格式为:typedef原创 2016-12-11 18:54:41 · 616 阅读 · 0 评论 -
[JNI] 开发基础(7)结构体
基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。有点生硬,对于java程序员来说,结构体就相当于java model比如定义 personclass Person{ string name; int arg; string cardId;}对于c来说要把这个对原创 2016-12-11 18:28:09 · 1217 阅读 · 0 评论 -
[JNI] 开发基础(6)字符串相关操作
撸代码时候字符串和数组是我们最常见的数据类型,要熟练使用c语言编程,字符串操作也要相当的熟练,这里介绍一些常见的字符串操作方法,不够完整,如果用到其他的方法可以查询 c语言字符串函数APIstrchr : 功能:查找字符串s中首次出现字符c的位置说明:返回首次出现c的位置的指针,如果s中不存在c则返回NULL。void main(){ char *str = "this is str原创 2016-12-11 16:46:40 · 844 阅读 · 0 评论 -
[JNI] 开发基础(5)内存分配
内存分配比较复杂,这里不做具体分析,可以看下这篇博客 分析的不错。静态分配与动态分配在C语言中,对象可以使用静态或动态的方式分配内存空间。静态分配:编译器在处理程序源代码时分配。动态分配:程序在执行时调用malloc库函数申请分配。静态内存分配是在程序执行之前进行的因而效率比较高,而动态内存分配则可以灵活的处理未知数目的。静态与动态内存分配的主要区别如下:静态对象是有名字的变量,可以直接对其进行操作原创 2016-12-10 21:08:42 · 1729 阅读 · 0 评论 -
[JNI] 开发基础(4)函数指针及指针函数
函数指针指向函数的指针包含了函数的地址,可以通过它来调用函数,函数指针与指针函数的最大区别是函数指针的函数名是一个指针格式:类型说明符 (*函数名)(参数)void (*sum)();实例:求两个数中较大值,较小值int max (int a, int b){ return a>b ? a:b;}int min (int a, int b){ return a<b ? a:b;}原创 2016-12-10 15:04:57 · 2099 阅读 · 1 评论 -
[JNI] 开发基础(3)指针操作
指针操作与指针变量相关-指针变量就是存放地址的变量。指针变量的引用主要涉及到两个方面:(1)对指针变量本身的引用,就是说对指针变量进行的各种运算(2)对指针变量所指向的目标,对指针进行引用。 通俗的说上述两种情况,一种是对地址的运算,一种是对地址所指向的变量进行间接引用。跟指针相关的操作符主要有3个:&、*、[](1)&:取地址运算符,(2)*:指针运算符—–取指针所指向的运算符。即:取指针变量(原创 2016-12-10 13:53:19 · 813 阅读 · 0 评论 -
[JNI] 开发基础 (2) 指针
指针是什么东西 指针处处在用,但是我们学习c语言时候,最难搞清楚的也是指针 一个生活中的例子:平时在淘宝上买东西,快递送到后,你不在家,那么快递员把快递寄送到门卫处,然后发短信通知你下班回家取。你根据短信就知道快递包裹在那里,这条短信的作用就相当于指针。在c/c++中的指针又是什么呢?看下面看一个申明一整型指针变量的语句如下:int * p;表面看起来与int i; 没什么区别,都是变量,只是原创 2016-12-03 21:18:27 · 693 阅读 · 0 评论 -
[JNI] 开发基础(1) c语言基本类型
头文件: 头文件引入,这个相当于java导入引用文件包,在编写的时候手动导入,有一部分ide会提示需要什么h文件#include <stdio.h>#include <stdlib.h>#include <string.h>#include <Windows.h>hello world学习什么语言,习惯性的从hello world开始void main(){ printf("hell原创 2016-12-03 18:20:51 · 585 阅读 · 0 评论