首页 技术 正文
技术 2022年11月16日
0 收藏 771 点赞 4,419 浏览 1847 个字

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

  • 需要访问Java平台无法访问的系统特性和设备;
  • 通过基准测试,发现Java代码比其他语言编写的等价代码慢得多;
  • 其他语言编写的代码已经经过大量测试和调试,并且知道如何将其导出到所有的目标平台上。

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

1. 创建java类文件

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

 package nativeTest; /**
* Created by jiax on 2016/12/30.
*/
public class HelloNative {
// 静态初始化代码块,保证虚拟机在第一次使用该类时就会装载库
static {
System.loadLibrary( "HelloNative" );
} // native 关键字表示本地方法,提醒编译器该方法将在外部定义
public static native void greeting(); // 测试greeting()函数
public static void main(String[] args) {
greeting();
}
}

2. 生成.h头文件

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

 javac HelloNative.java
cd ..
javah nativeTest.HelloNative

  生成的nativeTest_HelloNative.h如下:

 /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class nativeTest_HelloNative */ #ifndef _Included_nativeTest_HelloNative
#define _Included_nativeTest_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: nativeTest_HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_nativeTest_HelloNative_greeting
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif

nativeTest_HelloNative.h

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

3. 创建.c文件

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

 #include <stdio.h>
#include "nativeTest_HelloNative.h" JNIEXPORT void JNICALL Java_nativeTest_HelloNative_greeting(JNIEnv *env, jobject c1) {
printf("Hello Native!!\n");
}

4. 编译一个动态链接库

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

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

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

Linux上从Java程序中调用C函数

5. 运行测试

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

java nativeTest.HelloNative 

  如果出现如下错误:

Linux上从Java程序中调用C函数

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

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

  最终结果如下。

Linux上从Java程序中调用C函数

6 总结

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

  1. 在Java类中声明一个本地方法;
  2. 运行javah以获得包含该方法的C声明的头文件;
  3. 用C实现该本地方法;
  4. 将代码置于共享类库中;
  5. 在Java程序中加载该类库。

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

JDK——1.8.0_111

gcc——4.8.5

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,086
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,561
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,410
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,183
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,820
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,903