关闭

Java调用JNI的基本步骤(实现两数加法)

标签: jninativeJava与其他语言交互
775人阅读 评论(0) 收藏 举报
分类:

自学完JNI已经好久了,忘了更新博客,这两天把它补上,

JNI,全称为Java native interface ,是Java本地接口的意思,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++),JNI标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。但是,通过Java与本地已编译好的代码进行交互,这样会失去代码的可移植性,然而有时候这是必要的,比如使用一些库,或者是提高程序的性能。那下面就简单讲解一下JNI调用的步骤,实现一个简单的两数加法的例子。

1.新建一个Java工程,在Java类中声明一个native方法,不需要实现,


2.到Java工程的bin目录下使用javah命令生成包含native 方法定义的c/c++头文件,记得要带上包名,



3.在VC++ 6.0中新建一个DLL(动态链接库)工程,把生成的头文件,以及jni.h和jni_md.h复制到工程目录下,并把生成的头文件添加到工程中。

注意:jni.h,jni_md.h文件在你安装的jdk目录的includ、win32文件夹下面,如果不加这两个文件,在待会的运行中会报错。




4.打开添加的头文件,按照头文件编写源文件,复制头文件中的方法声明到源文件中进行实现,参数定义要写全,并且要添加头部引用;

在这里做个简单的说明:a.由于jni.h文件已经放入到工作空间当中,所以头文件中#include<jni.h>需要改为#include "jni.h",因为这个文件已经在当前目录下,使用“”才能加载到这个文件;

b.方法的参数:JNIEnv *env,jobject,指针和对象,一般来说简单的程序中很少用到这两个参数,这两个参数一般在调用反向JNI的时候就会起到关键性作用,jint x,int y就是在Java程序中传入的参数




5.将c/c++源文件编译成动态链接库文件(.dll),在这里,很有可能会出现一下的错误 jni.h找不到,那么就是前面说到的文件没有复制进去或者是文件中的头部没有修改。


编译无错了之后,运行成功,那么就在项目空间中debug文件夹下面生成了一个.dll文件


6.接下来我们把这个.dll文件拷贝到Java工程下面,并编写调用代码

我们在Main函数中通过System.loadLirbrary(“链接库名称”)调用动态链接库,不需要写上后缀名,然后实例化这个类,调用native方法,传入参数,打印出来,之后我们就可以运行这个程序了。


以上只是实现了简单加法操作,目的呢是讲解一下jni的调用步骤。

在调用JNI的过程中,如果想让多个Java工程调用同一个.dll文件,我们可以把生成的.dll文件所在的路径加到环境变量path路径下面,这样的话,重新启动eclipse之后,.dll文件就可以直接被多个工程调用了。




0
0
查看评论

JNI 调用的步骤

JNI
  • xiaopihair123
  • xiaopihair123
  • 2016-11-19 19:06
  • 1205

Java JNI实现原理初探

前言 写这个是出于好奇。 我们知道cpu只认得 "0101101" 类似这种符号, C、C++ 这些代码最终都得通过编译、汇编成二进制代码,cpu才能识别。而Java比C、C++又多了一层虚拟机,过程也复杂许多。Java代码经过编译成class文件、虚拟机装载等步骤...
  • hackooo
  • hackooo
  • 2015-09-12 17:31
  • 9053

java jni调用过程分析

1.定义java类中的native方法,新建下面一个类 public class NativeDemo { public static native void say(); //static的native方法 public native void sayHello()...
  • zhongweijian
  • zhongweijian
  • 2012-05-31 13:38
  • 1668

Java JNI调用动态库(Linux、Windows)的实现步骤

  • 2009-12-02 14:17
  • 4KB
  • 下载

剑指offer:不用加减乘除做加法(java)

题目:写一个函数,求两个整数之和,要求在函数体内不得适用+,-,* ,./  四则运算符号     面试的时候被问道这个问题,首先我们分析人们是如何进行十进制的加法的,比如如何得出5+17=22这个结果的,实际上,我们可以分三步进行:第一步只做各位相加不进位,此时相加...
  • abc7845129630
  • abc7845129630
  • 2016-10-15 15:58
  • 930

java实现不用加减乘除做2个数的加法

public class Solution {     public int Add(int num1,int num2) {          while (num2!=0) {       ...
  • zhouhao88410234
  • zhouhao88410234
  • 2017-05-08 17:44
  • 286

java JNI 实现原理 (六) 调用JNI方法

在前面的博客中提到过调用的JNI的entry是generate_native_entry,也就是说方法generate_native_entry是最终调用的我们的c++写的库文件里的方法
  • raintungli
  • raintungli
  • 2013-11-16 11:14
  • 3225

Java JNI完全手册

  • 2008-09-16 11:13
  • 46KB
  • 下载

用GUI实现求两个数的加法--方法二

/*     2015年10月10日20:55:32     文本框内容相加 方法二:         通过在B类中定义A类的属性,就可以达到在B类访问A类成员目的  &...
  • Prince140678
  • Prince140678
  • 2015-10-10 21:09
  • 334

java国际化步骤

1)将java文件中需要国际化的信息写在一个properties文件中 文件形式key-value对的形式,即如:hello=你好 命名方式:名称.properties  对于含有西欧字母的文件需要用native2ascii.exe执行文件编译 2)Java程序实现国际化时...
  • xixirupan
  • xixirupan
  • 2016-06-07 22:42
  • 329
    个人资料
    • 访问:8084次
    • 积分:224
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条