你的位置:首页 > Java教程

[Java教程]JNI笔记1


一、什么是JNI

Java Native Interface(JNI)是Java语言的本地编程接口

是 Java 与操作系统本地代码互相调用的功能的接口

二、Java 调用C/C++步骤:

 

1、在Java类中声明native方法

新建一个 Java 工程 TestNativeCode    包  com.fomagic   类 Testnative

1 package com.fomagic;2 3 public class TestNative {4   public native void sayHello(); //C++本地代码实现  5   public static void main(String[] args) {6     7   }8 }

2、使用javah命令生成包含native方法定义的C/C++头文件

 

3、按照生成的C/C++头文件来写C/C++ 源文件

    1) 在VS 中新建  Win32控制台应用程序  –> 确定 –> 下一步(即选择应用程序设置)

    2) 拷贝三个文件到 项目目录下

         com_fomagic_TestNative.h          第2步生成的头文件

         jni.h               位于 JDK 下的 include 文件目录中

         jni_md.h             include—>win32 目录

   3)  添加现有项 com_fomagic_TestNative.h   引入头文件(如图)

   4)  新建 源文件 source.cpp  添加如下内容

   5)  注意 引用的头文件“ <> ”代表从系统查找 、 “ ” “ ”  优先从本地查找

 

 

 

 

1 #include "com_fomagic_TestNative.h"2 #include <iostream>;3 using namespace std;4 5 //对 com_fomagic_TestNative.h 中声明的方法定义6 JNIEXPORT void JNICALL Java_com_fomagic_TestNative_sayHello (JNIEnv *evn, jobject obj)7 {8   cout<<"Hello World !"<<endl;9 }

4、将C/C++源文件编译成动态链接库(DLL)可执行二进制代码

      执行生成解决方案,在项目目录下的Debug 生成 DLL 文件 

 

5、把DLL文件所在路径添加到PATH环境变量下

      这个配置过Java环境变量的都应该是清楚的 , 这样可以方便Java程序直接调用当前的动态链接库

注意:需要注意的是Eclipse开发Java程序需要重启 来重新加载环境变量

6、java 类中加载DLL,然后调用声明的native方法

1 package com.fomagic;2 public class TestNative {3   public native void sayHello(); //C++本地代码实现  4   public static void main(String[] args) {5     System.loadLibrary("NativeCode"); //加载动态链接库,不能加 .dll   6     TestNative test=new TestNative();  7     test.sayHello();    8   }9 }

7、运行Java 项目

 

    1)  执行结果 :  Hello World !

    2)  异常信息 :  Can’t load IA 32-bit .dll on a AMD 64-bit platform  

解决办法:

前文中提到的的Java引用DLL动态链接库时,执行结果的 异常信息为: Can’t load IA 32-bit .dll on a AMD 64-bit platform 

原因:由于你的windows操作系统是64位,win32控制台程序默认生成 32位的 DLL 动态链接库

解决办法:  可想而知我们需要一个64位的DLL动态链接库,那就来生成一个

1、通过原来的VS项目 配置 (如图)

 

 

2、这时候生成则在  项目目录—-> x64 —-> Debug  目录 生成  NativeCode.dll

3、同理,把DLL文件所在路径添加到PATH环境变量下 ,方便Java程序加载, Eclipse则需要重启重新加载环境变量

 

三、弊端及注意点

  1. 使用JNI,这个java Application 将不能跨平台,如果要移植到别的平台上,则 native代码需要重新进行编写
  2. java是强类型语言,而C/C++则不是,因此,必须在写JNI时更加小心
  3. 在构建java程序的时候,尽量少用本地代码

 

 

 

转自:http://www.fomagic.com/index.php/232.html

 




新疆跟团旅游报价多少新疆旅游线路大全新疆旅游报价价格新疆旅游团购优惠深圳去新疆旅游报价2015南京大屠杀纪念日是几月几日? 2015年暑假去哪儿旅游好?推荐国内五大最佳夏游地 夏至是什么意思?2015夏至是哪一天? 庆祝六一歌词 深圳到东莞乐民游艺园自驾怎么走?深圳到水濂山乐民游艺园开车多长时间? 深圳到东莞乐民游艺园有直达车吗?深圳到水濂山乐民游艺园怎么坐车? 水濂山乐民游艺园坐几路车?东莞乐民游艺园公交车路线? 水濂山乐民游艺园官网,东莞乐民游艺园官方网站。 2015雷公峡漂流团购多少钱?象头山雷公峡漂流门票多少钱? 2015雷公峡漂流五一有什么好玩的?惠州雷公峡漂流五一好玩吗? 2015雷公峡漂流开漂了吗?惠州雷公峡漂流开漂时间? 稻城亚丁到底有哪些好玩儿的? 泰国的宗教信仰是什么? 迪拜的七星级酒店价格是多少? 泰国,有冬天吗?现在那边会冷吗? 深圳到马尔代夫的路线是什么?哪种最省事? AT28HC256F-12DM/883DNU Datasheet AT28HC256F-12DM/883DNU Datasheet AT28HC256F-12FM/883 Datasheet AT28HC256F-12FM/883 Datasheet AT28HC256F-12JC Datasheet AT28HC256F-12JC Datasheet 吉林去港澳5日游 吉林去港澳5日游 吉林去港澳5日游 牡丹江到港澳5日游 牡丹江到港澳5日游 牡丹江到港澳5日游 吉林跟团香港三日游 吉林跟团香港三日游 吉林跟团香港三日游