原则上来说,“100%纯Java”的解决方法是最好的,但有些情况下必须使用本地方法。特别是在以下三种情况:

需要访问Java平台无法访问的系统特性和设备;

通过基准测试,发现Java代码比其他语言编写的等价代码慢得多;

其他语言编写的代码已经经过大量测试和调试,并且知道如何将其导出到所有的目标平台上。

Java平台有一个用于和本地C、C++代码进行互操作的API,称为Java本地接口(JNI)。下面将举例讨论Linux平台下的JNI编程。

1. 创建java类文件

创建一个nativeTest包,在包下新建HelloNative.java文件。

1 packagenativeTest;

2

3 /**

4 * Created by jiax on 2016/12/30.

5 */

6 public classHelloNative {

7 //静态初始化代码块,保证虚拟机在第一次使用该类时就会装载库

8 static{

9 System.loadLibrary( "HelloNative");

10 }

11

12 //native 关键字表示本地方法,提醒编译器该方法将在外部定义

13 public static native voidgreeting();

14

15 //测试greeting()函数

16 public static voidmain(String[] args) {

17 greeting();

18 }

19 }

2. 生成.h头文件

使用以下命令生成一个C的头文件,nativeTest_HelloNative.h

1 javac HelloNative.java

2 cd ..

3 javah nativeTest.HelloNative

生成的nativeTest_HelloNative.h如下:

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

2 #include

3 /*Header for class nativeTest_HelloNative */

4

5 #ifndef _Included_nativeTest_HelloNative

6 #define _Included_nativeTest_HelloNative

7 #ifdef __cplusplus

8 extern "C"{

9 #endif

10 /*

11 * Class: nativeTest_HelloNative

12 * Method: greeting

13 * Signature: ()V

14 */

15 JNIEXPORT voidJNICALL Java_nativeTest_HelloNative_greeting

16 (JNIEnv *, jclass);

17

18 #ifdef __cplusplus

19 }

20 #endif

21 #endif

nativeTest_HelloNative.h

这个文件是在nativeTest文件夹外生成的,需要拖到nativeTest文件夹里面。

3. 创建.c文件

新建一个HelloNative.c文件,写出greeting()函数的实现代码。

1 #include

2 #include "nativeTest_HelloNative.h"

3

4 JNIEXPORT void JNICALL Java_nativeTest_HelloNative_greeting(JNIEnv *env, jobject c1) {

5 printf("Hello Native!!\n");

6 }

4. 编译一个动态链接库

使用Linux下的gcc编译器,命令如下:

gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -shared -o libHelloNative.so HelloNative.c

生成libMyNative.so文件,此时整个nativeTest目录文件结构如下:

5. 运行测试

输入如下命令运行HelloNative.class文件。

java nativeTest.HelloNative

如果出现如下错误:

则需要把libHelloNative.so所在文件夹加入java.library.path,使用命令:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:..../nativeTest

最终结果如下。

6 总结

总的来说,将一个本地方法链接到Java程序中需要经过以下5个步骤:

在Java类中声明一个本地方法;

运行javah以获得包含该方法的C声明的头文件;

用C实现该本地方法;

将代码置于共享类库中;

在Java程序中加载该类库。

附录——本文中用到的工具版本

JDK——1.8.0_111

gcc——4.8.5

linux java 调用c_Linux上从Java程序中调用C函数相关推荐

  1. Linux jsp php集成环境,ImageMagick在程序中调用(linux环境,jsp,php)

    最近发现图片格式为cmyk时,图片上传浏览器不能正常显示,图片缩放会变成黑屏, 后来通过google发现imagemagick的功能很强大,安装可以采用两种方法,1)直接与php编译安装,在程序中调用 ...

  2. 本地方法(JNI)——从java 程序中调用C函数

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法--从java 程序中调用C函数 的基础知识 : 2) for source code, ...

  3. java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份

    Java项目中调用bat批处理配合使用BCP进行多用户数据的备份 一.项目需求 最近项目中需要对数据库(Sql Server系列数据库)进行备份.项目中的需求不是简单的整个数据库的备份,而是根据用户来 ...

  4. 安卓程序中调用 linux 命令

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 在研究串口 jni 开发的时候,遇到了这样一段代码: Process su;su = Runtime.getRuntim ...

  5. iOS程序中调用系统自带应用(短信,邮件,浏览器,地图,appstore,拨打电话,iTunes,iBooks )...

    在网上找到了下在记录下来以后方便用 在程序中调用系统自带的应用,比如我进入程序的时候,希望直接调用safar来打开一个网页,下面是一个简单的使用: 查看更多iPhone应用程序的调用和第三方应用程序的 ...

  6. [翻译]Kean' Blog 在一个.NET应用程序中调用AutoCAD

    程序员通常要么整合功能到AutoCAD(利用其Plug-in结构,以增加命令,用户界面,对象等),或者调用它自动完成任务.显然,这两者之间的界限已经比较模糊,但是今天我们重点介绍第二类. 用于帮助理解 ...

  7. python调用安卓相机_Android在应用程序中调用相机程序

    有时,需要在应用程序中调用其他Android上已经安装完好的应用程序, 以下是一个调用相机(com.android.camera)的demo程序: PackageInfo pi = null; try ...

  8. 在C# winform程序中调用WPF写的数学公式编辑器

    由于工作原因,需要在程序中加入数学公式编辑功能,因此在网上找了不少开源数学公式程序.经过比较,最终选择了Math-Editor-master程序(可以在github上搜索此名称). 我的程序(简称主程 ...

  9. 在VB应用程序中调用Excel2000

    Visual Basic简称(VB)是设计Windows应用程序强有力的开发工具,"全球绝大多数Windows应用程序都是用VB开发的": Excel是目前使用最广泛的办公应用软件 ...

最新文章

  1. 简述vi编辑器的启动\退出\保存文件
  2. patch是什么意思啊_学 Vue 看这个就够了 - 什么是 Vue.js
  3. linuxpython23同时_linux上安装python3同时保留python2
  4. iOS之深入解析操作系统的架构
  5. Android TextView内容过长加省略号,点击显示全部内容
  6. Internet 网络协议族
  7. 与Serverless 的第一次亲密接触
  8. java 指针 地址压缩_JVM优化之压缩普通对象指针(CompressedOops)
  9. iOS应用支持IPV6及阿里云相关配置
  10. torch.max;PyTorch中 tensor.detach() 和 tensor.data 的区别;
  11. sublime实用快捷键 mac版
  12. JS中图片缓冲loading技术的实例代码
  13. 交易系统开发(七)——交易延迟分析
  14. 智能配电房综合监控系统的探讨
  15. ajax中php写法,jQuery中AJAX写法
  16. 通信技术发展的自然辩证法
  17. 0x0000006B蓝屏解决方法
  18. 怎么查询显卡hdmi接口版本_HDMI接口基础知识大扫盲
  19. ImageNet一作、李飞飞高徒邓嘉获最佳论文奖,ECCV 2020奖项全公布
  20. 【NHOI2019】初中组区赛解题思路

热门文章

  1. 研究生面试英语口语常见话题
  2. 美国人发了横财干什么?
  3. Tom邮箱好吗? “随心邮”微信收发邮件是怎么回事
  4. 电子信息制造业解决方案,电子工业采购监管、管理、降本可控化
  5. 2022/10/26 OR 27 关于java的接口初识 猫狗接口/教练学员案例
  6. ThinkPHP 5.1商城系统,电脑端+手机H5+微商城+小程序+买家端APP+卖家端APP+源码IM客服系统+线下收银系统
  7. 镍铬镍氢充电电池激活办法
  8. 荣耀4c android版本,荣耀4C有几个版本?华为荣耀4C畅玩版各版本区别介绍
  9. [汇编]汇编练习(1):写个拳皇13修改器
  10. CSS:过渡样式+鸭子表动画