使用Java语言进行开发时,可能由于处理速度、硬件控制或者复用既有的C/C++模块等方面的原因,需要Java层与使用C/C++编写的应用、模块或库进行交互,共同完成某些任务。在两者之间充当连接桥梁作用的就是Java本地接口(JNI,Java Native Interface)。本文通过一个小的例子,大致介绍下如何通过JNI在Java中调用C库函数的步骤。

开发环境
Windows XP / 7
JDK 1.6x
Microsoft Visual Studio 2010
1. 编写Java代码
写一个简单的Java类 - JNITest,并在该类中声明两个Native方法,接着在静态构造函数里调用System.loadLibrary()方法,加载具体实现本地方法的C运行库,源代码如下:
public class JNITest {
     native void printHello();
     native void printString(String str);
     
     static { System.loadLibrary("JNITest");}
     
     public static void main(String[] args) {
          JNITest myTest = new JNITest();
          myTest.printHello();
          myTest.printString("Hello, JNI's world!");
     }
}
2. 编译Java代码
在控制台里使用Java编译器(javac)编译步骤1中编写的Java源代码,生成.class文件:
> javac JNITest.java
3. 生成C语言头文件
运行Javah命令,生成C语言头文件,构建函数原型,以便C语言函数与Java代码中的本地方法映射在一起:
> javah JNITest
4. 编写C语言源代码
创建文件JNITest.c,编写源代码如下:
#include "JNITest.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_JNITest_printHello
  (JNIEnv *env, jobject obj)
  {
     printf("Hello World!\n");
     return;
  }
  
JNIEXPORT void JNICALL Java_JNITest_printString
  (JNIEnv *env, jobject obj, jstring string)
  {
     const char *str = (*env)->GetStringUTFChars(env, string, 0);
     printf("%s!\n", str);
     return;
  }

5. 生成C共享库
打开Visual Studio 2010 Command Prompt,输入如下编译命令,生成共享运行库JNTTest.dll:
> cl -I"C:\Program Files\Java\jdk1.7.0_06\include" -I"C:\Program Files\Java\jdk1.7.0_06\include\win32" -LD JNITest.c -FeJNITest.dll
6. 运行Java程序
执行java命令,运行JNTTest类,查看输出结果是否正常:
> java JNTTest
Hello World!
Hello, JNI's world!!

转载于:https://www.cnblogs.com/sunjinbo/archive/2012/08/24/2654668.html

如何通过JNI在Java中调用C库函数相关推荐

  1. java调用jni接口,Java 中通过jni接口调用native code

    [    Java语言本身是通过Java的虚拟机解释执行的,因此对于Java中调用本地动态链接库的问题便提上了日程,为何会存在这样的需求呢?因为Java本身的机制导致一些要求高效率 在上上篇中已经介绍 ...

  2. java 调用 go_实践总结:在 Java 中调用 Go 代码

    在 Java 中调用 Go 的大致过程如下go --> cgo --> jna --> java 整个过程要解决的问题主要两个:数据类型在两种语言中如何转化 何时清理无用的数据 下面 ...

  3. java中调用 dll 动态库的简洁方法 JNative

    Java中调用DLL方法,是通过JNI接口实现的,http://www.ibm.com/developerworks/cn/java/l-linux-jni/ 这里有详细的说明.大概是先用Java写一 ...

  4. Java中调用C++代码

    Java中调用C++代码 1.Idea创建一个Solution类 public class Solution {public native void sayHello();static{System. ...

  5. 一步一步教会你JAVA中调用C++

    装载自:http://blog.csdn.net/chenjin_zhong/article/details/5870305 一.JNI简介 JNI:Java Native Interface,是Ja ...

  6. java中调用dll文件的两种方法

    https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...

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

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

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

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

  9. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

最新文章

  1. 几个非常低调的公众号!但副业月入早已过3万...
  2. java建造_java建造者模式
  3. redis 漏洞利用与防御
  4. mysql5.7.12 my.ini文件_MySQL5.7缺少my.ini文件的解决方法
  5. 基于UML的面向对象分析与设计
  6. 集群服务负载均衡------LVS
  7. php curl cookie,php中curl获取返回页面的cookie
  8. IDEA显示完整目录,取消合并的文件,取消“ . “ 的这种目录
  9. WCF之旅读书笔记(2):WCF如何通过Binding进行通信
  10. vbs按钮传递过程_iOS面试题:事件传递和响应机制
  11. protobuf 编码实现解析(java)
  12. 无错版Vsftpd Mysql Pam设置虚拟用户要领
  13. 7、网友问答之ASCII字符传转换为数值-------------labview宝典
  14. 工业互联网标识解析与标识服务机构服务能力成熟度等级评估管理平台【需求规格说明书/用户手册】
  15. Linux libaio 实例,linux libaio安装
  16. 2021鹏业安装算量软件常见问题整理(六)
  17. 个人防骗大全精选(1)
  18. mySQL 2502 2503错误
  19. effective C++条款四十三解读
  20. 删除文件夹时显示文件已在另一个程序中打开的解决方法

热门文章

  1. boa服务器 系统设置,Ubuntu中配置boa服务器
  2. python延时队列_超简便Python任务队列:huey
  3. 数据库SQL命令经典面试题65道
  4. JPA#Interfaces总结
  5. gdb+zbacktrace找到cpu过高php代码
  6. Keepalived实现双机热备
  7. 跨浏览器检测某个节点是不是另一个节点的后代
  8. 微信公众平台开发--判断终端使用的浏览器是否是微信浏览器
  9. 解决织梦 \include\userlogin.class.php on line 21(或16) 报错的方法
  10. 对python文件方法open的探究