方法一:通过php扩展方式
参考:php引用 加载动态库(.so) 文件_三雷科技的博客-CSDN博客_php 加载so
步骤:
- 把c函数编译成.so文件。 .so文件是动态链接库,其他程序可以在运行时动态链接.so文件。
- 在php扩展中定义一个php函数,去调用c函数
- 编译php时,利用 "make LDFLAGS=-l" 选项指定要加载的动态库,把.so文件加载进来。
这样,在php中,就可以像调用内置函数一样调用c函数了,很方便。
方法二:通过system、exec函数
参考:PHP 调用C的代码_深度Java的博客-CSDN博客_php调用c
思路:
- 把c函数编译成可执行文件
- 使用system或者exec命令执行可执行文件,就跟执行其他shell程序一样。
知识扩展
linux系统为动态连接器提供了一个简单的接口,允许应用程序在运行时加载和链接共享库。
void *dlopen(const char *filename, int flag);
参考:https://www.cnblogs.com/anker/p/3746802.html
那么,在java中如何加载.so共享库呢?
Java定义了一个标准调用规则,叫做java本地接口(Java Native Interface,JNI),它允许Java程序调用本地的C和C++函数。
JNI的基本思路是将本地C函数,如foo,编译到共享库中,如foo.so。
当一个正在运行的Java程序试图调用函数foo时,Java解释程序利用dlopen接口(或者与其类似的接口)动态链接和加载foo.so,然后再调用foo。