Java(JNI)代码访问本地代码C、C++


1、Java是跨平台的语言,但是在有些时候仍然是有需要调用本地代码(这些代码通常是由C/C++编写的)。 
2、Sun公司提供的JNI是Java平台一个功能强大的接口。这个JNI接口提供了Java与操作系统本地代码互相调用的功能。 

二、最简单的Java调用C/C++代码的步骤(Java通过调用C++本地代码在控制台输出HelloWorld)(使用IDE工具是Eclipse3和Visual Studio 2008) 
1、首先在Java类中声明一个native的方法 
操作: 
-->使用Eclipse3新建名为Native工程 
-->新建名为TestNative类并选择生成main方法 
-->添加native方法public native void sayHello() ; 
Java代码 
  1. package org.jee ;   
  2.   
  3. public class TestNative{   
  4.   
  5.     public native void sayHello() ;   
  6.   
  7.     public static void main(String[] args){   
  8.     }   
  9.   
  10. }  
  11. package org.jee ;
  12. public class TestNative{
  13.     public native void sayHello() ;
  14.     public static void main(String[] args){
  15.     }
  16. }
注:C/C++是需要先声明的。而Java是通过使用JDK的bin目录的javah可执行文件,来生成对应的C/C++声明。 

2、使用Javah命令生成包含native方法定义的C/C++头文件。 
操作: 
-->在命令行输入javah org.jee.TestNative(在classes或bin文件夹下输入并生成org_jee_TestNative.h文件) 
C++代码 
/* DO NOT EDIT THIS FILE - it is machine generated */  
#include <jni.h>   
/* Header for class org_jee_TestNative */  
  
#ifndef _Included_org_jee_TestNative   
#define _Included_org_jee_TestNative   
#ifdef __cplusplus   
extern "C" {   
#endif   
/*  
* Class:     org_jee_TestNative  
* Method:    sayHello  
* Signature: ()V  
*/  
JNIEXPORT void JNICALL Java_org_jee_TestNative_sayHello(JNIEnv *, jobject);   
#ifdef __cplusplus   
}   
#endif   
#endif  

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_jee_TestNative */

#ifndef _Included_org_jee_TestNative
#define _Included_org_jee_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     org_jee_TestNative
* Method:    sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_jee_TestNative_sayHello(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif


3、按照生成的C/C++头文件来写C/C++源文件 
操作: 
-->使用VS2008新建项目NativeCode(Win32控制台应用程序) 
-->应用程序设置-->应用程序类型选择DLL(生成动态连接库)-->附加选项选择空项目 
-->将org_jee_TestNative.h文件拷贝到该NativeCode下的NativeCode文件夹下 
-->右击IDE左上角项目的头文件节点选择添加现有项并选择org_jee_TestNative.h 
-->右击源文件节点添加新项选择C++文件(添加名为source类代码如下) 
-->将Sun的JDK下的inlude文件下的jni.h和子文件夹win32下的jni_md.h两个头文件拷贝到NativeCode下子文件夹NativeCode下 
(注意:#include "jni.h"是当jni.h文件不在系统环境变量时使用,而#include <jni.h>是当jni.h文件在系统环境变量下时使用)C++代码 
/* DO NOT EDIT THIS FILE - it is machine generated */  
#include "jni.h"   
/* Header for class org_jee_TestNative */  
#include"org_jee_TestNative.h"   
#include<iostream>   
using namespace std;   
  
JNIEXPORT void JNICALL Java_org_jee_TestNative_sayHello (JNIEnv * env, jobject obj)   
{   
    cout<<"Hello World!"<<endl;   
}  

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class org_jee_TestNative */
#include"org_jee_TestNative.h"
#include<iostream>
using namespace std;

JNIEXPORT void JNICALL Java_org_jee_TestNative_sayHello (JNIEnv * env, jobject obj)
{
cout<<"Hello World!"<<endl;
}


4、将C/C++源文件编译成动态连接库(DLL) 
操作: 
-->右击IDE左上角NativeCode工程选择生成(在NativeCode项目的子文件夹Debug下的NativeCode.dll文件) 

5、DLL文件加入到PATH环境变量下 
将DLL文件(NativeCode.dll)添加到环境变量Path中 
操作: 
-->右键我的电脑选择属性-->选择高级-->选择环境变量 
-->在环境变量path后加入(动态连接库的路径).../NativeCode/Debug 
(注意:每当设置环境变量时,必须重启IDE工具才能生效) 

6、Java类中加载DLL,然后调用声明的native方法。(填写TestNative类的main方法) 
Java代码 
  1. public static void main(String[] args) {   
  2.     // TODO Auto-generated method stub   
  3.     // 加载动态连接库DLL,如果没有找到的话,则会在运行时报错   
  4.     System.loadLibrary("NativeCode");   
  5.        
  6.     TestNative tnt = new TestNative();   
  7.            
  8.     tnt.sayHello();   
  9. }  
  10. public static void main(String[] args) {
  11.     // TODO Auto-generated method stub
  12.     // 加载动态连接库DLL,如果没有找到的话,则会在运行时报错
  13.     System.loadLibrary("NativeCode");
  14.     
  15.     TestNative tnt = new TestNative();
  16.         
  17.     tnt.sayHello();
  18. }
7、运行该项目正确结果会输出Hello World! 

三、使用JNI的两个弊端 
1、使用了JNI,那么这个Java Application将不能跨平台了。如果要移植到别的平台上,那么native代码就需要重新进行编写。 
2、Java是强类型的语言,而C/C++不是。因此,你必须在使用JNI时更小心。 
3、总之,必须在构建Java程序的时候,尽量少用本地代码。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

無名VF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值