在java虚拟机规范的内存管理划分中,对于虚拟机内存空间划分中专门划了一块内存叫做“本地方法栈(Native Method Stack)”。本地方法栈是为了java专门用来调用native方法而划分出来的一块内存。
我们平时在阅读jdk源代码时也经常能够看到jdk底层存在很多没有java实现方法体的native method,对于这些方法,用java就看不到它的具体实现过程了。那么这些native方法到底是怎样实现的呢?
抱着对于native方法的好奇心,查找了不少资料,了解到java的native方法是通过JNI,即java native interface来实现的,可以通过它来实现java与其他语言之间的交互。结合理论我通过实际的编写测试终于运行成功了一个通过java调用c语言方法的demo。下面把具体编写过程分享给大家:
首先我们要编写一个简单的java类来进行测试,这个java类主要实现的功能计算出两个整型数字的和并在控制台打印出来。其中两数相加的方法是通过native方法调用C语言方法实现的,即我们需要实现一个有输入输出参数的java调用c语言的方法。我将这个java类创建在D:\nativetest文件夹下,文件名为:NativeTest.java;其中代码如下:

public class NativeTest {public native int plusTest(int a, int b);static {System.loadLibrary("NativeTestImpl");}public static void main(String[] args) {NativeTest nativeTest = new NativeTest();int a = 1, b = 2;int sum = nativeTest.plusTest(a, b);System.out.println(a + "加" + b + "的和等于" + sum);}
}

编写完NativeTest.java这个类之后,我们需要将其在命令行用javac方式将其编译成class文件。

再通过JNI提供的方式使用javah -jni NativeTest命令生成一个NativeTest.h文件

生成的NativeTest.h文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeTest */#ifndef _Included_NativeTest
#define _Included_NativeTest
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     NativeTest* Method:    plusTest* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_NativeTest_plusTest(JNIEnv *, jobject, jint, jint);#ifdef __cplusplus
}
#endif
#endif

其中自动生成并声明的JNIEXPORT jint JNICALL Java_NativeTest_plusTest (JNIEnv *, jobject, jint, jint);的
法就是我们需要在本地方法去实现的方法。
下面我们就来编写一个包含在NativeTest.java中声明了的native方法的实现方法的NativeTestImpl.cpp文件,具体代码如下:

#include "NativeTest.h"
#include <stdio.h>
#include <jni.h>JNIEXPORT jint JNICALL Java_Plus_twoNumberPlus(JNIEnv *, jobject, jint a, jint b){int sum;sum = a + b;return sum;}

接下来我们需要将你本地电脑上jdk安装路径下include文件夹中的jni.h文件和include\win32文件夹中的jni_md.h这两个文件复制到vc++6.0的安装路径中的include文件夹下,我的路径是: C:\Program Files\Microsoft Visual Studio\VC98\Include;每个人电脑使用编辑器和路径不同。

接下来我们需要使用命令行指令通过NativeTestImpl.cpp生成一个dll动态链接库文件,具体指令如下:
cl\LD D:\nativetest\NativeTestImpl.cpp

如下图所示:

完成这一步操作之后,在D:\nativetest路径下就生成了NativeTestImpl.dll;NativeTestImpl.exp;NativeTestImpl.lib;NativeTestImpl.obj四个文件,具体如下图所示:

完成这一步之后我们就可以通过之前编写的那个NativeTest类中的natvie方法plusTest(int a, int b)调用c语言方法了。具体的调用及结果如下:

到此,我们就完成了一个简单的java调用c语言的小demo。
注:本次测试使用的是32位win7系统和32位的jdk,之前使用64位的win7系统和64位的jdk出现了Can’t  load  IA  32-bit  .dll  on  a   AMD  64-bit  platform错误,测试没有成功。

参考文献:
http://blog.csdn.net/xw13106209/article/details/6989415

JAVA中native方法调用C语言实现学习相关推荐

  1. JAVA中native方法(实现例子)

    JAVA中native方法 鸣谢:http://blog.csdn.net/zhangliao613/article/details/6325978 Java不是完美的,Java的不足除了体现在运行速 ...

  2. java 调用 js性能_太快了,太变态了:什么会影响Java中的方法调用性能?

    java 调用 js性能 那么这是怎么回事? 让我们从一个简短的故事开始. 几周前,我提议对Java核心libs邮件列表进行更改 ,以覆盖当前final一些方法. 这刺激了一些讨论主题-其中之一是其中 ...

  3. 太快了,太变态了:什么会影响Java中的方法调用性能?

    那么这是怎么回事? 让我们从一个简短的故事开始. 几周前,我提议对Java核心libs邮件列表进行更改 ,以覆盖当前final一些方法. 这刺激了一些讨论主题-其中之一是其中一个性能回归通过采取这是一 ...

  4. Java中的方法调用有多昂贵

    我们都去过那儿. 在查看设计不良的代码的同时,听听作者对人们永远不应该牺牲性能而不是设计的解释. 而且,您不能说服作者摆脱其500行方法,因为链接方法调用会破坏性能. 好吧,这可能在1996年左右是正 ...

  5. java中的输入语句判断正负_在java中使用方法调用统计数组中正数的个数,将判断数据的正负功能定义成方法...

    满意答案 donglin820 推荐于 2018.04.21 public class TestDemo { static int count = 0;// 统计整数的个数 public static ...

  6. 使用JavaSymbolSolver解决Java代码中的方法调用

    为什么创建java-symbol-solver? 几年前,我开始使用JavaParser ,然后开始做出贡献. 不久之后,我意识到我们想对Java代码执行的许多操作不能仅通过使用解析器生成的抽象语法树 ...

  7. eclipse折叠if语句块_「03」java中的方法以及控制语句

    语句块(有时叫做复合语句),是用花括号扩起的任意数量的简单Java语句.块确定了局部变量的作用域.块中的程序代码,作为一个整体,是要被一起执行的.块可以被嵌套在另一个块中,但是不能在两个嵌套的块内声明 ...

  8. c语言访问oc变量,OC中的方法调用流程

    OC是一门动态语言,其方法调用方式与C++还是有很大区别的. 具体的方法调用过程,可以参考下面一片枫叶的博客,写的还是很详细的. 对于OC的方法调用,有两个点是重点: 1.对于OC的一切方法调用,最终 ...

  9. java基础提升篇:Java中Native关键字的作用

    初遇 初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法: public native int hashCode(); 为什么有个native呢?这是我所要 ...

最新文章

  1. 虚拟机下CentOS 6.5配置IP地址的三种方法
  2. JDK5.0中JVM堆模型、GC垃圾收集详细解析 .
  3. 服务器如何开启远程控制,远程控制命令设置方法介绍
  4. jquery 常用属性和函数(part I)
  5. 基于业务解释的特征重要性计算
  6. 005. how is RFC to backend determined - maintenance view IWFNDV_MGDEAM
  7. php select user 验证,php 用户验证的简单示例
  8. 使用ITEXT操作PDF文件
  9. 6.18-WizNote MD 指南
  10. 一口气读完系列最穷的穷光蛋
  11. vue中使用highCharts的drilldown钻取图、3D等图
  12. 六:Python断言方法:assert
  13. 如何从Win11系统安装回win10系统?
  14. 使用计算机组成原理全加器设计,杭电计算机组成原理全加器设计实验1
  15. 2018BDWF大数据世界论坛主题内容公布!
  16. 人体骨骼关键点检测综述
  17. 游戏阴阳师启动闪退问题解决
  18. Zepto中文API
  19. linux安装tomcat
  20. 【优化】梯度下降 收敛性 证明

热门文章

  1. 习题解答_反正切函数的求导
  2. Python_文本分析入门_SnowNLP(1)
  3. H3C设备运行状态查询常用命令(建议收藏)
  4. Spring事务切面原理
  5. Idea 中如何导入项目
  6. Debug与Release版本的区别
  7. 用Unity进行网络游戏开发(一)
  8. CSDN 如何修改用户名(CSDN ID)?
  9. 大厂软技能最佳实践--金字塔原理篇
  10. 应用于客户端的性能测试指标