Java程序调用自定义c语言程序

计算机中有很多的编程语言,各有各的特色和应用范围。Java混合编程就是Java程序和其它应用程序进行通讯和数据交互,比如我们都知道c语言的计算性能要比Java的略好一些,所以Java程序可以调用c语言程序来进行一些比较耗时的计算工作,从而提高程序性能。

# JNI编程

例子:调用c语言方法实现两个整数相加,返回相加的结果

步骤:

  • 定义类JNITest和方法sum(int, int)
  • 调用javac.exe编译,得到JNITest.class
  • 调用javah.exe(javah.exe也是jdk自带的)得到包含该方法(Java_ipso_JNITest_sum())的头文件JNITest.h
  • 实现.c文件(对应JNITest.h)
  • 将.c和.h文件,整合为共享库(DLL)文件
  • 在Java类中,加载响应的共享库文件

具体实现


/* -------------------  这是Java程序  -------------------*/package ipso.JNI;public class JNITest {public static native int sum(int num1, int num2);public static void main(String[] args) {System.loadLibrary("JNITest");   // dll名字JNITest test = new JNITest();int sum = test.sum(3, 4);System.out.println("使用c语言求得两数和为:" + sum);}
}// 使用cmd工具并cd到项目目录下,使用命令javah -cp [字节码目录(不包括包名)] [包名+class名] 得到如下文件/* -------------------  这是javah -cp [字节码文件目录] [字节码文件名] 命令生成的C语言头文件  -------------------*/// 经过上一步操作得到如下ipso_JNI_JNITest.h C语言头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ipso_JNI_JNITest */#ifndef _Included_ipso_JNI_JNITest
#define _Included_ipso_JNI_JNITest
#ifdef __cplusplus
extern "C" {#endif
/** Class:     ipso_JNI_JNITest* Method:    sum* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_ipso_JNI_JNITest_sum(JNIEnv *, jclass, jint, jint);   // 将这里复制到.c C语言文件中并实现该方法的逻辑体#ifdef __cplusplus
}
#endif
#endif/* -------------------  这是引入javah命令生成的C语言头文件的C语言文件,在这里实现两个整数相加的计算  -------------------*/// 编写ipso_JNI_JNITest.c文件用来实现程序逻辑如下:
// 这是ipso_JNI_JNITest.c文件
##include "ipso_JNI_JNITest_sum.h"
JNIEXPORT jint JNICALL Java_ipso_JNI_JNITest_sum(JNIEnv *env, jobject obj, jint num1, jint num2){return num1 + num2;
}void main(){}// 将上面的.c文件使用gcc编译成共享文件库.dll(windows上)文件或者.so(Linux上)文件, 注意共享文件库的32/64位要于JDK的32/64位相匹配
// gcc编译成dll文件的命令可以搜索,除了gcc也可以用其它的c语言编译工具编译成共享文件库文件。
// 到这里JNITest类中的sum方法就可以享普通Java方法一样使用了。

# 最后

以上的例子可以将业务逻辑部分扩展一下从而实现更复杂的逻辑功能。每个语言都有自己的特色和应用范围,程序开发中可以根据业务逻辑调用不同的程序语言来实现不同的业务逻辑,从而达到取长补短的效果。Java也提供了其它语言的调用方式,比如说脚本语言js可以使用ScriptEngine来实现调用js程序或者其它脚本程序,这里不再细说,感兴趣的读者可以自行查询文档。喜欢的点个赞,给作者更多鼓励。

Java程序调用c语言程序相关推荐

  1. JAVA调用C语言程序

    JAVA调用C语言程序 JAVA调用C语言程序 1. 编写带有native声明的方法的Java类 2. 使用javah 生成:jniSample.h的头文件 3. 使用C实现本地sum方法:(这里我生 ...

  2. python怎么调用c语言_Python调用C语言程序方法解析

    Python调用C语言程序方法解析 首先我们需要将编写好的c程序文件编译为动态库文件(后缀名为.so) 使用下面的命令: gcc 原文件名.c -shared -o 新文件名.so 然后在python ...

  3. c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...

    点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...

  4. c 语言程序编辑,C语言程序编辑学习篇—编程者说之C语言

    谈及C语言,我想凡是学过它的朋友都有这样一种感觉,那就是"让我欢喜让我忧."欢喜的是,C语言功能非常强大.应用广泛,一旦掌握了后,你就可以理直气壮地对他人说"我是电脑高手 ...

  5. JAVA中调用C语言函数简单教程

    背景知识 本地代码 在JAVA中使用其他语言的代码(如C/C++)称为本地代码. 历史原因 JAVA的早期阶段,很多人认为使用C和C++来加速JAVA应用中的关键部分是个好主意,但是实际上,虽然JAV ...

  6. 程序设计基础(c语言),程序设计基础(C语言)

    <程序设计基础(C语言)>由会员分享,可在线阅读,更多相关<程序设计基础(C语言)(26页珍藏版)>请在人人文库网上搜索. 1.程序设计基础(C语言),东北大学高级语言程序设计 ...

  7. linux c程序调用脚本,C程序与Lua脚本相互调用

    Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows ...

  8. c语言温度查表程序,温度计C语言程序.doc

    温度计C语言程序 /* */ //MCU头文件 #include #include 延时:nop //数据结构定义 #define U8unsigned char 8字节 无符号字符型 2 8 256 ...

  9. c语言220程序,《C语言程序实例大全》原代码220例

    <C语言程序实例大全>,一共220个. 找了很多地方都不全,最后在CSDN上用积分下载了这个,C语言初学者可以参考. 下载地址: http://doc.xuehai.net/tp09770 ...

最新文章

  1. T5,一个探索迁移学习边界的模型
  2. 外媒:Facebook新发展方向或模仿微信
  3. Http Module 介绍(转)
  4. 科大星云诗社动态20220112
  5. mysql 查询优化 ~ explain与索引失效
  6. 设计网站导航|强大且智能的设计师导航
  7. linux v4l2 示例程序,linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析)...
  8. debian webmin 安装
  9. MySQL · 特性分析 · 执行计划缓存设计与实现
  10. 基于智能电网的电力线载波通信研究
  11. 基于 CIM 的智慧社区总体框架
  12. 服务器虚拟内存会导致卡顿吗,win7设置虚拟内存后导致电脑卡怎么办
  13. Django快速上手
  14. 中标麒麟系统下(Neokylin7)达梦数据库的安装(DM8)
  15. 使用C++代码创建一个Windows桌面应用程序
  16. 计算机音乐天使重构,天使重构
  17. 将mybatis打印的Preparing与Parameters转化为可执行sql
  18. 第十二章作业(1.水果店
  19. mac m1使用picGo + gitee搭建免费图床
  20. 百度知道与搜搜问问推广的优劣势

热门文章

  1. 几款四千元左右笔记本电脑推荐
  2. 一文搞懂 Service Mesh 和 API Gateway 关系和区别
  3. 低压铜排、电缆接头温度监测的应用场景及解决方案有哪些?
  4. NBA名人堂之-查尔斯·巴克利|里克·巴里|罗伯特·帕里什|斯科蒂·皮蓬|戴夫·德布斯切尔
  5. 利用apihook,实现微信电脑版音量放大
  6. 11月英语--慢慢回温
  7. Lua: attempt to call method ‘xxxx‘ (a nil value)
  8. java获取二维数组长度
  9. Android面试题集
  10. c3p0连接池技术和Druid连接池技术比较