zoukankan      html  css  js  c++  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

  • 相关阅读:
    firewalld添加/删除服务service,端口port
    centos7下配置ftp服务器
    CentOS安装vsftpd FTP后修改默认21端口方法
    虚拟机,安装tools时出现“安装程序无法继续解决
    Linux下mysql数据库备份
    测试linux下磁盘的读写速率
    redis状态详解
    office2010安装不了提示已经安装32位的了怎么办
    nginx安装部署
    结构体赋值
  • 原文地址:https://www.cnblogs.com/gongxing/p/4675462.html
Copyright © 2011-2022 走看看