先介绍一下jni:Java Native Interface,它能够使java和其他编程语言编写的应用程序和库进行相互操作。

java中调用c函数,主要是通过本地化接口jni来实现的,在windows下,调用的是dll文件,在unix下,调用的是so文件。这里先介绍编写调用c函数的基本步骤:

(1):编写.java文件,其中c中的函数要用public native static修饰。

(2):编译.java文件为.class文件,使用javah生成.h文件。

(3):按照.h文件中的函数形式在c中实现函数。

(4):生成.dll文件,拷贝到java工程中。

(5):运行java文件。

注意以下几点:(1)如果java源文件放在包中,一定要在工程目录下使用javah命令。(2)在编写c函数时,要把jni.h和jni_md.h文件放在c的工程中。(3)在java文件中包含如下一句:static{System.loadLibrary("")},引号中为生成的动态连接库文件,不用加扩展名,系统会自动识别的。

JAVA调用DLL简单小例子

这个小例子用JNI调用了VC++做的DLL动态库。

1、总体说明:

实现一个函数,传入整形数i,返回值i*i,这个函数做在DLL中,java将通过JNI调用这个函数,传入一个参数,得到返回值。

确定DLL的名称为calldll.dll,函数shanfei(int i)。

2、编写java程序javacall.java,如下:

public class javacall

{

static

{

System.loadLibrary("calldll");

}

public native static int shanfei(int i);

public static void main(String[] args)

{

javacall jc = new javacall();

int j;

j = jc.shanfei(4);

System.out.println(j);

}

}

3、编译

javac javacall.java

4、生成头文件

javah javacall

生成javacall.h文件

5、制作VC++动态库

建立新DLL工程,程序中添加:

#include "javacall.h"

JNIEXPORT jint JNICALL Java_javacall_shanfei (JNIEnv *, jclass, jint p)

{

int j = p*p;

return j;

别忘了将javacall.h复制到VC工程目录中,然后编译,如果编译说找不到jni.h文件,可以将jni.h复制到工程目录中,还可将javacall.h文件中的#include 改为#include "jni.h",再编译。

6、java调用

将生成的calldll.dll文件复制到javacall.java所在的目录中,运行

java javacall,应该可以看到运行结果。

注意可能发生以下几种情况:

1、当你做到第6步时,发现calldll一直不能装载,则将calldll.dll拷贝到windows\system32\ 下即可

2、当找不到jni.h时即提示错误(fatal error C1083: Cannot open include file: 'jni.h': No such file or directory将以下文件:)\jdk\include\jni.h\jdk\

include\win32\jawt_md.h\

jdk\include\win32\jni_md.h

将以上三个文件复制到Visual Studio.net的安装目录下的\Vc7\include目录中

java中如何调用c_java中如何调用c函数相关推荐

  1. java中调用c_java中调用c语言函数?

    拉丁的传说 要在java中调用c语言的库,需要使用Java提供了JNI.举例说明在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示H ...

  2. java中 如果类c_Java中,如果类C是类B的子类,类B是类A的子类,那么下面描述正确的是( )。_学小易找答案...

    [单选题]社会意识是() [判断题]刘易斯认为,在发展中国家,经济发展应当追求最高精尖的技术.( ) [单选题]财务杠杆反映的是 [判断题]是否承认社会历史的规律性,是唯物史观和唯心史观的根本对立. ...

  3. android 调用java类_Android中在WebView里实现Javascript调用Java类的方法

    搜索热词 为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制.只要调用addJavascriptInterface方法 ...

  4. jsp 调用java_jsp中调用java代码小结

    原封不动的传送给客户端有两个小例外: 1. 如果想传送 , 由于它跟jsp的特殊符号一致, 所以必须使用转义字符转义, 2. 如果想传送注释, 在 jsp 编辑页面中出现, 而在生成的html文档不出 ...

  5. python中如何调用类_python如何调用java类

    由于 python 本身为脚本语言,且经常存在调用第三方库的情况,有的时候用 java 调用 python 不如用 python 调用 java 方便.下面就整理一下在 python 调用 java ...

  6. Java 中使用反射来创建对象、调用方法

    Java 中使用反射来创建对象.调用方法 反射创建对象 反射调用方法 反射调用私有方法 反射调用可变参私有方法 反射调用的方法自身可以抛出异常的情形   假设已有下面的类: import java.l ...

  7. java主程序怎样调用子程序_存过和函数以及在Java程序中的调用

    存储过程,函数都是数据库的对象. 创建和调用 存储在数据库中的子程序,是由plsql语言写的,完成特定功能的程序. 函数可以返回值,存过不能返回值.除此之外,一致. create procedure ...

  8. 此异常最初是在此调用堆栈中引发的:_【8】进大厂必须掌握的面试题Java面试异常和线程...

    点击上方"全栈程序员社区",星标公众号 重磅干货,第一时间送达 Q1.错误和异常有什么区别? 错误是在运行时发生的不可恢复的情况.如OutOfMemory错误.这些JVM错误无法在 ...

  9. Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?

    文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...

最新文章

  1. 彻底理解android中的内部存储与外部存储
  2. JS的NaN与isNaN
  3. 算法分析 运动员循环赛_「98跑」大众跑者的训练比专业运动员更累!
  4. Java基础教程:面向对象编程[2]
  5. JavaSE——IO(上)(File、字节流、字符流、转换流、打印流、缓存流)
  6. 从输入一个url到浏览器页面展示都经历了哪些过程?
  7. MATLAB在运筹学背包问题的应用,运筹学论文之二维背包问题.docx
  8. 【Elasticsearch】所有可用 Qbox 插件概述:第一部分
  9. 生日在java中怎么写_如何用java写代码:输入自己的生日,距离今天已过多少天,或者还有...
  10. Git--rebase合并提交
  11. Azure PaaS服务密钥的安全性
  12. [渝粤教育] 武昌理工学院 跨境电商实务 参考 资料
  13. scrapy-redis 和 scrapy-splash结合 做分布式渲染爬取
  14. Android按键之Menu详解
  15. Stacked Hourglass Networks - 堆叠沙漏网络结构详解
  16. 密码学---攻击类型
  17. RFID 中间件规范 -- ALE 介绍
  18. python 将base64字符串还原成图片保存
  19. 代码改变生活-文件重命名
  20. 微信域名防封的方法以及技术原理

热门文章

  1. 网站用阿里云mysql速度慢_改用RDS后为什么数据库变慢?
  2. 天猫店群是什么意思?天猫店群和传统模式相比有什么优势?
  3. 【AWS系列】第七讲: AWS Serverless之API Gateway
  4. 亚马逊美国本土州 FBA仓库地址预览
  5. Const在函数前后的区别
  6. 怎样在线做动图?一招教你快速完成gif动画制作
  7. Quartus II 13.0无modelsim进行仿真(用自带仿真器)
  8. Android .so 文件使用
  9. OPPO k10x 和 IQOO z7x 和 红米 note12 怎么选
  10. js-xlsx插件导出table把字符串当做数字处理解决办法