前面系统研究了 JNI 的相关操作,下面就来小试牛刀,做一个实际的练习。

记得去年我曾经用 C 语言写过一个 PHP 的 md5 扩展函数,那么今天就花一点点时间用 JNI 来实现一遍吧。

不过这里可要提前声明了,虽然是实现 md5 函数,但是这里并不会从头写 md5 算法,而是投机取巧使用到了 linux 内核提供的crypto库。

废话不多说,首先来写一个 Java 类

MyString.java

 1public class MyString {
 2    static {
 3        System.loadLibrary("mymd5");
 4    }
 5
 6    private...

最近在整理学习笔记的时候发现了去年年中记录的 JNI 学习笔记,由于存放在了为知笔记中,而如今为知笔记已经不再免费,于是想到了将其重新整理一遍,一来可以巩固所学,二来能将其迁移到本地

1 简介

有时候,使用 native code(c/c++)来克服 Java 中的内存管理和性能的局限性是很有必要的。Java 支持 native codes,被称作 Java Native Interface(JNI)。

JNI 非常难,毕竟它牵涉到了两种编程语言。假设聪明的你对 Java 和 C/C++以及 GCC 编译器已经有所了解。那么下面就一起来一步步学习 JNI 吧。

2 开始

2.1 用 c 语言实现第一个 JNI...

说明:参考文献地址 A Malloc Tutorial

1 简介

malloc是干什么的?如果你连这个名字都没听过,那么你应该先去了解 Unix 环境下的 c 语言开发,然后再来阅读。对一个程序员而言,malloc是一个在 c 语言中用来分配内存的函数,但是大多数人并不知道它背后真正的原理,甚至有些人认为malloc是 c 语言的关键字或者认为它是系统调用。事实上,malloc是一个再简单不过的函数而已,而且只需要很少的操作系统相关知识就可以让我们彻底理解它的原理。

下面来一步步的实现一个简单的malloc函数,从而帮助我们理解其背后运作的原理。因为仅仅作为说明原理之用,所以这里实现的malloc不会太高效,但是足以说明原理。

什...

Preface

当今世道,各种高级语言百花齐放。然而会有人发出这样的疑问–计算机真的能够识别这么多语言吗?稍微有点常识的人都知道,这显然是不可能滴!在计算机的世界里,他们能够直接识别的只有机器语言。然而,由于机器语言对人类不够友好,所以人们才发明了汇编,c,Java…许许多多的人类易读的编程语言,所以我个人对编程语言的理解一直是其实他们就是机器语言的语法糖,而编程语言的创造过程,就是定义一种合理的,没有二义性的语法规则,然后就是通过直接或间接的方式实现该语法到机器语言的转换过程。既然是这样的话,那么我们就很容易想到,计算机语言是一个自我完善的过程:首先我们定了一种非常简单的 x1(这里只是用来举例说明,有...

函数调用

很多时候,我们需要通过函数名来调用函数,并传递参数,或者把匿名函数作为函数的参数传递,实现回调。当我们在遇到这样的需求的时候,用 php 代码实现起来肯定是非常容易和简单的。但是,当我们在用 c 语言编写 php 扩展的时候,如何来实现这样的功能呢?下面就一起来深入了解 php 内核,看看如何实现。

在 Zend 引擎中,给我们提供了zend_call_function,call_user_function以及call_user_function_ex函数来帮助我们实现函数调用。在zend_API.h文件中,我们可以看到如下函数原型的声明:

1ZEND_API int zend_call_function(...