1、原生(Native)函数的概念

在Java程序中,可以使用由其他编程语言实现的函数,这种函数,在Java中被称之为

原生(Native)函数。

2、在Java程序中使用原生函数的优缺点

1)优点

A、在Java程序中,可以复用已由其他语言实现的各种库。

可能已存在很多由其他语言编写的库,为了在Java程序中能够复用这些库, 就需要用到原生函数。

B、增加了Java标准类库中不存在的功能

由于Java的可移植性,它不能利用与操作系统相关的特点,因此,当要访问 特定的硬件设备或使用新的网络驱动器时,就不得不使用原生函数提供的功 能。

2)缺点

A、任何包含原生函数的Java类均不能用于Applet程序。

这主要是出于安全性的考虑,因为Java的安全管理机制难以防范来自原生函 数的恶意攻击。

B、使用原生函数将会使Java程序失去可移植性。

因为,你必须为运行该Java程序的各种平台编写不同的原生函数链接库。

3、原生函数的实现步骤

1)JNI接口

JNI接口是Java Native Interface的缩写,它已成为Java平台的一部分,它允许

在Java程序中调用由其他语言编写的函数。

JNI接口标准的设计目的有:

A、Java标准类库可能不支持应用程序中需要用到的与平台相关的功能,这部分功 能就需要由JNI来实现。

B、对于已存在的由其他语言编写的库或者应用程序,在Java程序中,可以通过 JNI来实现对这些已存在接口的调用。

C、可能需要用低级语言如汇编来实现一些对运行时间很严格的代码,在Java程序

中,就可以通过JNI接口来调用这些代码。

2)原生函数的实现步骤

A、编写带有native声明的Java类,如test.java

B、使用javac命令编译第一步中编写的java类,如javac test.java,假设生成的文 件为test.class

C、使用javah命令来生成java类对应的存根头文件,如javah -jni test,假设生成 的文件为test.h

D、使用C/C++来实现test.h中的native接口,如test.c

E、将test.c编译为动态链接库,如libtest.so。

这样,执行命令java test就可以运行了。

4、例子

在这里,我们编写一个最简单的打印hellow world的例子

1、编写一个带有native声明的Java类,如test.java

class TestJni

{

public native void myPrint();

static

{

System.loadLibrary("hellow");

//动态链接库的名字(linux下对应为libhellow.so)

}

public static void main(String args[])

{

TestJni test = new TestJni();

test.myPrint();

}

}

2、使用javac命令编译第一步中编写的java类

#javac test.java

这条命令将会编译该java程序,并生成相应的字节码文件:TestJni.class

3、使用javah命令来生成java类对应的存根头文件

#javah -jni TestJni

这条命令会根据指定的字节码文件生成相应的存根头文件TestJni.h,其内容如下:

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

#include <jni.h>

/* Header for class TestJni */

#ifndef _Included_TestJni

#define _Included_TestJni

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class:     TestJni

* Method:    myPrint

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_TestJni_myPrint

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

4、使用C/C++来实现TestJni.h中的native接口,比如将其相应的实现命名为TestJni.c:

#include <stdio.h>

#include "TestJni.h"

JNIEXPORT void JNICALL Java_TestJni_myPrint

(JNIEnv *, jobject)

{

printf("Hellow World!/n");

}

5、将TestJni.c编译为动态链接库

执行命令:

g++ -shared -o libhellow.so TestJni.c -I/usr/lib/jvm/java-6-sun-1.6.0.24/include

-I/usr/lib/jvm/java-6-sun-1.6.0.24/include/linux/

该命令运行后会生成名为libhellow.so的动态链接库。

注意:生成动态链接库时,头文件路径需要根据具体情况而修改

最后,就可以通过命令执行相应的java程序了(这里一般需要设置环境变量:LD_LIBRARY_PATH,即动态链接库libhellow.so 的路径):

#java TestJni

输出为:Hellow World!

这表明,一切OK。

参考资料:http://apps.hi.baidu.com/share/detail/5452254

//调用原生函数

Java中原生(native)函数的用法相关推荐

  1. java中原生方法_java中原生(native)函数的用法

    1.原生(Native)函数的概念 在Java程序中,可以使用由其他编程语言实现的函数,这种函数,在Java中被称之为 原生(Native)函数. 2.在Java程序中使用原生函数的优缺点 1)优点 ...

  2. Java中的split()函数的用法

    split()方法介绍 方法原型: public String[] split(String regex, int limit)- regex -- 正则表达式分隔符.- limit -- 分割的份数 ...

  3. android java split_Java中的split函数的用法

    Java中的 split  函数是用于按指定字符(串)或正则去分割某个字符串,结果以字符串数组形式返回: 例如: String str="1234@abc"; String[] a ...

  4. Java正则表达式--Matcher.group函数的用法

    https://www.cnblogs.com/jiafuwei/p/6080984.html Java正则表达式--Matcher.group函数的用法 原来,group是针对()来说的,group ...

  5. java中的string函数_java中string.trim()函数的作用实例及源码

    trim()的作用:去掉字符串首尾的空格. public static void main(String arg[]){ String a=" hello world "; Str ...

  6. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | DexFile 构造函数及相关调用函数 | Android 源码中查找 native 函数 )

    文章目录 一.DexFile 构造函数 二.DexFile.openInMemoryDexFile 函数 三.Android 源码中查找 native 函数 一.DexFile 构造函数 上一篇博客 ...

  7. java drawstring字体大小,JAVA中,drawstring 方法的用法,格式是什么啊

    啦啦啦额68的回答 Java中Graphics类的drawString()方法: i)drawString(String str,int x,int y): String str是可以在屏幕上显示的字 ...

  8. Java中获取当前函数名

    Java中获取当前函数名 博客分类: Java JavathreadJDKIDEA  有时候我们需要在程序中获取当前运行的函数名,如何简单的做到这点呢?我们可以用getStackTrace轻松搞定. ...

  9. java中函数的调用,java中如何调用函数

    java动态调用函数,Java 中使用动态代码,java函数调用,java中如何调用函数 如何在 Java 中调用 C 函数 宗薇 [期刊名称]<网络新媒体技术> [年(卷),期]2000 ...

  10. Java中final的三种用法

    在java中final的三种用法: 1. final成员变量 2. final函数 3. final类 final成员变量 当你在类中定义变量时,在其前面加上final关键字,那便是说这个变量一旦被初 ...

最新文章

  1. 简单几步解决企业USB端口隐患
  2. 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)
  3. Altium Desiger18 打印 丝印简单的方法
  4. .NET Core + Kubernetes:Volume
  5. MVC与MVVM的区别
  6. Tyvj P1463 智商问题 分块
  7. anaconda3 2.3.9 下载_多体系如何融合?先做好体系意识的培训!(附4合1体系培训下载)...
  8. share一段采集程序的代码
  9. java插入数据库字符串拼接_java连接mysql数据库实现单条插入和批量插入
  10. NLP简报(Issue#7)
  11. 深入浅出SharePoint Designer 2010
  12. c语言根号11取值两位小数,用C语言将一个数开根号后再取倒数的方法
  13. 京东移动端分类页面侧导航栏实现
  14. Selenium和Firefox对应版本
  15. python中每个if条件后面都要使用冒号_每个if条件后面都要使用冒号。
  16. VMWare VMNet 8 的配置使用
  17. 代价高昂的免费机器人课程{人工智能与机器人教育之个人感悟}
  18. 【王道笔记-操作系统】第四章 文件管理
  19. (转)日语汉字音便规则
  20. 【04】SAP ABAP性能优化 - 如何选用内表类型(STANDARD, SORTED, HASHED)?

热门文章

  1. java+springboot+mysql个人理财管理系统
  2. android音乐播放器Media
  3. python做飞机大战游戏单机_Python制作简易版飞机大战小游戏
  4. idea通过svn上传_IDEA提交整个项目到svn
  5. 设置Xshell最大显示行数
  6. 日常用语--警告/劝解
  7. php把接收到的16进制转成字符串,php将16进制转为字符串的方法
  8. OpenGL中gl,glu,glut的区别
  9. 智能卡脚本语言easyCard
  10. CVPR 2019 Oral 论文精选汇总,值得一看的 CV 论文都在这里(持续更新中)