Java调用Native方法

1 篇文章 0 订阅
1 篇文章 0 订阅

Java调用Native方法

Java中支持调用其他语言(C、C++),想要实现调用,需要进行以下几步操作。

编写Java类并声明Native方法

package my.mynative.background;

public class Student {

    public native int getAge();

    public native void setAge(int age);

    static{
        //载入动态链接库,参数为动态链接库的名称
        System.loadLibrary("Student"); 
    }

}

生成**.h头文件

**.h文件是C或者C++语言中的头文件,类似于Java中的接口类
  1. 首先将Java类进行javac Student.java 编译成class文件

  2. 使用JDK自带jni生成**.h头文件,命令为:javah -jni Student

    **.h文件生成后名称为my_mynative_background_Student.h,打开该文件结果如下:

    /*这个文件正常情况下不用修改*/
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class Student */
    
    #ifndef _Included_Student
    #define _Included_Student
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * 这个是根据我们Java中定义的Native方法自动生成的
     * Java_my_mynative_background_Student_getAge名称生成的规则为:Java_类的包名_类名_方法名
     * Class:     Student
     * Method:    getAge
     * Signature: ()I
     */
    JNIEXPORT jint JNICALL Java_my_mynative_background_Student_getAge
      (JNIEnv *, jobject);
    
    /*
     * 同上方一样,也是自动生成的
     * Class:     Student
     * Method:    setAge
     * Signature: (I)V
     */
    JNIEXPORT void JNICALL Java_my_mynative_background_Student_setAge
      (JNIEnv *, jobject, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

生成DLL文件

我们在这里生成DLL文件使用的工具为DEV-C,可以自行去网上下载。
(注:下载时请根据自己的操作系统位数下载,比如64位操作系统下载时请下载支持64位的工具)
  1. 下载安装完成之后打开DEV工具,点击左上角:文件->新建->项目->basic->DLL,然后选择C项目,名称为System.loadLibrary时参数的名称,然后选择工作空间。

  2. 创建完成后左侧目录中就可以看到自己新建的DLL项目,然后点击项目右键,选择New File,创建一个后缀为.cpp的文件(.cpp文件类似于Java中的接口实现类),编写如下信息:

    /*#include类似Java中的import,将我们刚刚生成头文件**.h通过""引入
    (双引号引入默认会从编辑的文件目录开始查找,尖括号引入的头文件会从系统目录开始查找)*/
    
    #include "my_mynative_background_Student.h"
    
    /*引用C内置头文件*/
    
    #include <stdio.h>
    
    /*引用JDK中jni头文件*/
    
    #include <jni.h>
    
    
    int age;
    
    /*
     * 重写我们刚刚生成的.h头文件中定义的方法,请注意要给参数加上名称(JNIEnv对象提供了java与C类型互转或者调用java方法提供了工具方法,jobject是如果在java中定义的Native方法是类方法,那么它则是该类的对象,如果是静态Native方法,则····百度去吧)
     * Class:     Student
     * Method:    getName
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jint JNICALL Java_my_mynative_background_Student_getAge
      (JNIEnv *env, jobject obj){
        /*返回值为jint,jint可以和C中int直接互转,不需要其他操作,但是如果是其他类型,比如String或者java的对象类型的话需要进行其他的辅助操作进行转换*/
        return age;
      }
    
    /*
     * Class:     Student
     * Method:    setName
     * Signature: (Ljava/lang/String;)V
     */
    JNIEXPORT void JNICALL Java_my_mynative_background_Student_setAge
      (JNIEnv *env, jobject obj, jint a){
        age = a;
      }
    
  3. .cpp文件编写完成之后我们需要将其依赖的.h头文件复制到相应的目录中

    • 将我们自己生成**.h头文件放入与.cpp文件相同目录下
    • 将%JAVA_HOME%/include/jni.h文件和%JAVA_HOME%/include/win32/jni_md.h文件复制到系统目录/include下(系统目录即使用的工具IDE安装目录下会有一个include,该目录下存放的是C内置的头文件,比如我的安装路径为:C:\Program Files (x86)\Dev-Cpp,那么我需要复制到C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include目录下,具体地址需要看情况)
  4. 然后点击运行->编译,之后在我们的工作空间中就可以找到.dll文件

运行Java程序并调用本地方法

  1. 将dll文件复制到我们的Eclipse项目中,具体放到哪里自己决定,我的项目将dll文件复制到src/main/resources/dll路径

  2. 然后右键项目->properties->java Build Path->Source->MyNative/src/main/java(定义Native方法所在的类的包)->Native libary location,然后点击右侧Edit->Workspace选择src/main/resources/dll目录即可

  3. 调用本地方法,进行测试。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值