一、Java调用C/C++代码

一、什么是JNI

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

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

 

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

 

1、在Java类中声明native方法

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

 

package com.fomagic;
 
public class TestNative {
    public native void sayHello(); //C++本地代码实现    
    public static void main(String[] args) {
        
    }
}

 

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)  注意 引用的头文件“ <> ”代表从系统查找 、 “ ” “ ”  优先从本地查找


  


 

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


 

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

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

 

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

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

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

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

 

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

 

7、运行Java 项目

 

    1)  执行结果 :  Hello World !

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

                         (大概意思就是 64位的AMD 平台不能加载32 位的 .dll 文件) 解决办法看这里

 

三、弊端及注意点

 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值