近期项目需要使用Java调用本地一个很老的C写的库,就顺便研究了下Java调用本地代码的一些方法。整理一下出一个小系列。主要就是介绍两种不同的方法:JNI和JNA。作为第一篇,我们先动手用C写个简单的动态链接库,为后面的文章做准备。
什么是动态链接库
先做个基础的普及。C/C++编译出来的库有两种:静态链接库和动态链接库。
静态库后缀名在Windows上是.lib,Unix/Linux上是.a。当你的程序在编译时引用静态库,编译器会将整个静态库都包含在你编译后的可执行文件中,所以可执行文件会很大,但是程序执行时就不再需要静态库了。
动态库后缀名在Windows上是.dll,一般存放在C:\Windows\System32下;Unix/Linux上是.so,一般存放在/lib或/usr/lib下。程序编译时,编译器不会将动态库包含在生成的可执行文件中,所以引用动态库的可执行文件较小,程序会在运行过程中动态加载所需要的库。对于Java程序员就可以将它简单的想象成.jar文件。在Unix/Linux上,动态链接库一般都命名为”libxxx.so”,其中”xxx”是库名。
创建动态链接库
这里我们使用Linux环境,用C语言创建一个动态链接库”libhello.so”,库里面就提供一个hello()函数。根据输入的字符串,在屏幕上打印相应的欢迎信息。
编写头文件”hello.h”,声明hello()函数
#ifndef _HELLO_H_
#define _HELLO_H_
/* C++需加上extern "C" 声明 */
#ifdef __cplusplus