zoukankan      html  css  js  c++  java
  • JNI_最简单的Java调用C/C++代码

    JNI_最简单的Java调用C/C++代码



    JNI。是Java Native Interface的简称,中文是“Java本地调用”。通过这种技术能够做到下面两点:

    • Java程序中的函数能够调用Native语言写的函数。Native一般指的是C/C++编写的函数。

    • Native程序中的函数能够调用Java层的函数,也就是说在C/C++程序中能够调用Java的函数。

    本篇博客带给童鞋们下面内容,学习内容来自(传智播客)。经由小巫总结整理:
    • javah工具的使用方法
    • 依照C/C++头文件来编写C/C++源文件
    • C/C++源文件编译成动态连接库(DLL
    • Java程序中引入动态连接库等知识


    JNI并非什么特别奇妙的东西,当初SUN推出它的目的是为了屏蔽不同操作系统平台的差异性,通过Java语言来调用Native语言的功能模块,避免反复制作车轮,最主要是这两个目的。

        最简单的Java调用C/C++代码,有下面步骤,童鞋们最好具体阅读,避免出现相应的错误:
    • 首先在Java类中声明一个native的方法
    • 使用Javah命令生成native方法的声明的C/C++头文件
    • 依照生成的C/C++头文件来编写C/C++源文件
    • 将C/C++源文件编译成动态链接库(DLL)
    • 将DLL文件加入到PATH环境变量下
    • Java类中载入DLL,然后调用声明方法


    我们如今一步一步把整个流程熟悉一遍,在Eclipse中创建一个Java项目:
       笔者创建了一个命为:TestNativeCode的项目,新建包名为com.wwj.nativecode,新建类为TestNativeCode
    接着在TestNativeCode类其中声明我们的本地方法:
    package com.wwj.nativecode;
    
    public class TestNativeCode {
    	// 声明本地方法
    	public native void sayHello();
    	public static void main(String[] args) {
    //		// 载入动态链接库
    //		System.loadLibrary("nativeCode");
    //		TestNativeCode nativeCode = new TestNativeCode();
    //		nativeCode.sayHello();
    
    	}
    }
    

    凝视掉的代码后面非常快会用到,临时不用管。

    我们声明了本地方法之后,就能够用jdk中javah命令来为我们生成相应的头文件,在命令能够敲入javah -help:


    会显示出javah命令的一些使用參数和意义。


    找到我们Java项目TestNativeCode的路径:笔者这里是D:workspaceTestNativeCode

    我们进入bin文件夹,就能够找到相应的字节码文件:


    我们用这个来生成我们所须要的.h文件:


    格式为:javah 包名.文件名称

    生成成功后。我们能够在当前路径下生成的.h文件:

    以上的步骤已经非常清楚的介绍怎样使用javah命令生成native头文件。受用编辑器打开头文件,有下面代码:
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_wwj_nativecode_TestNativeCode */
    
    #ifndef _Included_com_wwj_nativecode_TestNativeCode
    #define _Included_com_wwj_nativecode_TestNativeCode
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_wwj_nativecode_TestNativeCode
     * Method:    sayHello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_com_wwj_nativecode_TestNativeCode_sayHello
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    接着在Visual studio中创建一个win32控制台应用程序。取名为nativeCode:



    创建成功后,将我们生成的头文件剪切到C++项目中。并在项目中引入:



    新建源文件:source.cpp


    依据头文件来编写源文件:


    我们发现代码中有错。原因是我们没有引入“jni.h"头文件,jni.h头文件是在我们的jdk文件夹下,include文件夹下:


    把jni.h拷贝到项目中去,执行项目发现例如以下错误:
    1>------ 已启动生成: 项目: nativeCode, 配置: Debug Win32 ------
    1>  source.cpp
    1>c:usersadministratordocumentsvisual studio 2012projects ativecode ativecodejni.h(45): fatal error C1083: 无法打开包含文件:“jni_md.h”: No such file or directory
    ========== 生成: 成功 0 个。失败 1 个,最新 0 个,跳过 0 个 ==========

    还是缺少头文件了,jni_md.h也是在jdk中:

    相同把它加入到项目中去:


    如今代码已经没有错误提示了,执行成功之后会生成我们须要的DLL文件,在相应的Debug文件夹下能够找到:


    接着把这个动态库加入到PATH环境变量中去,笔者的路径为(C:UsersAdministratorDocumentsvisual studio 2012Projects ativeCodeDebug):


    最后在Eclipse中使用Java调用我们的Native代码:
    package com.wwj.nativecode;
    
    public class TestNativeCode {
    	// 声明本地方法
    	public native void sayHello();
    	public static void main(String[] args) {
    		// 载入动态链接库
    		System.loadLibrary("nativeCode");
    		TestNativeCode nativeCode = new TestNativeCode();
    		nativeCode.sayHello();
    
    	}
    }
    

    执行java项目,假设声明了环境变量之后,没有重新启动Eclipse会报这种错:


    这时我们重新启动一下Eclipse让环境变量生效就可以。

    但最后调用的时候出现了这个错误,小巫暂未解决:



    望路过的大神,给你解决方式。动态库是载入成功了。但调用方法是时候出现错误了。

    2014/9/10 博文更新


    非常抱歉隔了这么久才来更新这篇博客,小巫之前的这个错误已经解决掉了,为什么会出现链接错误呢,主要还是链接库的问题。

    我们创建的VS项目,是Win32的平台,而小巫的操作系统是64位的,所以我在Eclipse载入链接库的时候会报错。那么怎样来解决问题呢。我们须要配置VS编译的平台,我们须要配置为x64位。





    配置完之后,又一次编译执行。在项目根文件夹会生成x64的文件夹

    然后我们把使用x64平台生成的动态链接库配置到环境变量中去:
    我的路径是:C:UsersAdministratorDocumentsvisual studio 2012Projects ativeCodex64Debug


    接着我们重新启动Eclipse。执行我们的測试项目,这个时候就没有错误了。




  • 相关阅读:
    linux下shell显示-bash-4.1#不显示路径解决方法
    update chnroute
    An error "Host key verification failed" when you connect to other computer by OSX SSH
    使用dig查询dns解析
    DNS被污染后
    TunnelBroker for EdgeRouter 后记
    mdadm详细使用手册
    关于尼康黄的原因
    Panda3d code in github
    Python实例浅谈之三Python与C/C++相互调用
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5306194.html
Copyright © 2011-2022 走看看