要在java中调用c语言的库,需要使用Java提供了JNI。

举例说明

在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.

现在分别从Java和C语言两部分说明:

1. Java 部分

首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:

public class HelloNative {

public native void sayHello();

}

编译这个类,生成class文件:

javac HelloWorld.java

利用javah生成需要的h文件

javah HelloNative

生成的 h文件大概如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class HelloNative */

#ifndef _Included_HelloNative

#define _Included_HelloNative

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: HelloNative

* Method: sayHello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloNative_sayHello

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。

2. C语言部分

根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:

#include

#include "HelloNative.h"

JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)

{

printf("Hello World!\n");

}

代码编写完成之后,我们再用gcc编译成库文件,命令如下;

gcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp

这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.

接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative");

public class TestNative

{

static {

try {

System.loadLibrary("HelloNative");

}

catch(UnsatisfiedLinkError e) {

System.out.println( "Cannot load hello library:\n " + e.toString() );

}

}

public static void main(String[] args) {

HelloNative test = new HelloNative();

test.sayHello();

}

}

但是再编译后,运行的时候,问题又出现了.

Cannot load hello library:

java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path

Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V

at HelloNative.sayHello(Native Method)

at TestNative.main(TestNative.java:13)

载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?

用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:

1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好

2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中

3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH

这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了

java调用c语言编辑器_如何用java调用c语言编译器实现在线编译c语言?相关推荐

  1. java编写大数据分析模型_如何用Java(DOM分析器)编写XML文件

    java编写大数据分析模型 Earlier we learned how to read XML file and how to edit XML file in java using DOM Par ...

  2. java 判断手机运营商_如何用java判断手机号运营商?

    如何用java实现判断手机号的运营商?因为每个号段都是工信部规定划分给指定运营商的,所以我们可以通过手机号码的号段来判断. 现在手机号的号段那么多,要怎样方便的的判断呢?于是我们就想到了正则表达式,在 ...

  3. java编程九九乘法表_如何用JAVA语言编写一个九九乘法表

    教一下学了JAVA語言的同学们撰写一个99玖玖乘决表 方法 进行设计构思:假如把99玖玖乘决报表中如"1*1=1"算式全部当作一个一字的笔画体得话,99玖玖乘决表可当作一个倾斜角二 ...

  4. java程序如何解代数方程_如何用java编程来解决方程问题?

    展开全部 public class Fc { int a, b, c; public void gen() { double i; double j = 1.0; double k = 1.0; i  ...

  5. java控制器文件内容替换_如何用Java来进行文件切割和简单的内容过滤的实现

    一 由来 去年由于项目的需求,要将一个任意一个文件制作成一个xml文件,并且需要保持文件内容本身不产生变化,还要能够将这个xml重新还原为原文件.如果小型的文件还好处理,大型的xml,比如几个G的文件 ...

  6. 用java编写的爱情红心_如何用java实现每天给对象发情话

    一.引言 最近看到一篇用js代码实现表白的文章,深有感触. 然后发现自己也可以用java代码实现,然后就开始写代码了,发现还挺有意思的,话不多说开搞 实现思路: 使用HttpClient远程获取彩虹屁 ...

  7. java data是什么文件_如何用java实现 读取一个data类型文件 并显示出来(随便选择一种类型txt或者word)...

    展开全部 参考下面的程序32313133353236313431303231363533e4b893e5b19e31333264626635,基本上已经包含了文件读取的所有方式,这也是我之前学习的一个 ...

  8. java 快速删除文件夹_如何用Java删除文件夹里的所有文件?

    import java.io.File; public class Test { public static void main(String args[]){ Test t = new Test() ...

  9. java怎么实现日程提醒_如何用java和xml实现日程提醒

    [[[xml中不是写db连接,而是db连接的信息. 连接还是要在java代码里头实现的]]]] 你是不是没有用到框架,比如struts,spring.. 而是直接的jsp servlet? xml文件 ...

最新文章

  1. 在VMWare中配置SQLServer2005集群 Step by Step(四)——集群安装
  2. qt练习7 定时爆炸小游戏
  3. 【PP操作手册】创建和下达返修生产订单
  4. Boost:mighty bimap强大的双图的测试程序
  5. macOS 10.13 安装Virtualbox失败
  6. 为开源做贡献,我们要做一次最具挑战的尝试!
  7. 老司机和驾驶辅助系统相处得如何?MIT研究人员做了个科学研究
  8. E20180715-hm
  9. C#和java和android中的NetWorkAdapter,httpRequest,WebView,json,xml
  10. Java并发编程75道面试题及答案 1
  11. Valine-1.4.4新版本尝鲜+个性制定(表情包、qq头像、UI样式)
  12. HTML+CSS+JavaScript实现植物大战僵尸(附演示地址)
  13. 为啥海康摄像头网页无法预览
  14. echarts 大数据可视化
  15. 耗时两天,Html实现小米官网
  16. 基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程
  17. Opencv裁剪图片大小
  18. Python-Cartopy调用自带线上地图作为底图
  19. 心路历程:爬虫实战——从数据到产品
  20. 虚拟机VHD格式解析到NTFS文件系统解析

热门文章

  1. 【mongodb双响曲】:mongodb的基本使用
  2. JavaScript 09 - 函数
  3. windows通过bat文件快速启动和关闭redis服务
  4. 迅虎WordPress scocial登录插件 付费下载 授权算法
  5. 激活函数总结(sigmoid、tanh、RELU、LRel、PReLU、ELU、GELU和SELUS)
  6. c++ const函数返回值
  7. 刷题记录(2023.3.14 - 2023.3.18)
  8. 下午一口气睡了五个小时
  9. ITK学习笔记——OSTU自动选取最佳阈值进行二值化
  10. 通过计算机培养学生的应用能力,计算机教学如何培养学生的应用能力