加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

java程序调用c++代码是你需要掌握的

发布时间:2021-05-29 05:42:37 所属栏目:编程 来源:互联网
导读:1、筹备java代码 起首界说一个包括了native要领的类如下,之后我们要行使这个类中的native要领通过jni挪用c++编写成的动态链接库中的要领: public classJniTest

起首界说一个包括了native要领的类如下,之后我们要行使这个类中的native要领通过jni挪用c++编写成的动态链接库中的要领:

public class JniTest { 

    static{ 

        System.loadLibrary("MyNativeDll"); 

    } 

 

    public static native void callCppMethod(); 

 

    public static void main(String[] args) { 

        System.out.println("DLL path:"+System.getProperty("java.library.path")); 

        callCppMethod(); 

    } 

在代码中首要完成了以下事变:

在静态代码块中,挪用loadLibrary要领加载当地的动态链接库,参数为不包括扩展名的动态链接库库文件名。在window平台下会加载dll文件,在linux平台下会加载so文件,在mac os下会加载jnilib文件

声明白一个native要领,native要害字认真关照jvm这里挪用要领的是当处所法,该要领在外部被界说

在main要领中,打印加载dll文件的路径,并挪用当处所法

2、天生头文件

在行使c/c++来实现当处所法时,必要先建设.h头文件。简朴的来说,c/c++措施凡是由头文件(.h)和界说文件(.c或.cpp)构成,头文件包括了成果函数、数据接口的声明,而界说文件用于誊写措施的实现。

在jdk8中可以直接行使javac -h指令天生c/c++说话中的头文件。假如你行使的是较早版本的jdk,必要在执行javac编译完成class文件后,再执行javah -jni天生c/c++气魄威风凛凛的头文件(在jdk10的新特征中已经删除了javah这一指令)。我们行使的jdk8简化了这一步调,使其可以一步完成,在呼吁行窗口下执行呼吁:

javac -h ./jni JniTest.java 

指令中行使 -h参数指定安排天生的头文件的位置,最后的参数是java源文件的名称。在这个进程中完成了两件事变,起首天生class文件,其次在参数指定的目次下天生头文件。天生的头文件com_cn_jni_JniTest.h内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */ 

#include <jni.h> 

/* Header for class com_cn_jni_JniTest */ 

 

#ifndef _Included_com_cn_jni_JniTest 

#define _Included_com_cn_jni_JniTest 

#ifdef __cplusplus 

extern "C" { 

#endif 

/* 

 * Class:     com_cn_jni_JniTest 

 * Method:    callCppMethod 

 * Signature: ()V 

 */ 

JNIEXPORT void JNICALL Java_com_cn_jni_JniTest_callCppMethod 

  (JNIEnv *, jclass); 

 

#ifdef __cplusplus 

#endif 

#endif 

天生的头文件和各人认识的 java接口有些相似,只有函数的声明而没有详细实现。简朴的表明一下头文件中的代码:

extern "C"汇报编译器,这部门代码行使C说话法则来举办编译

JNIEXPORT和JNICALL是jni中界说的两个宏,行使JNIEXPORT支持在外部措施代码中挪用该动态库中的要领,行使JNICALL界说函数挪用时参数的入栈出栈约定

函数名称由包名+类名+要领名构成,在该要领中有两个参数,通过第一个参数JNIEnv *的工具可以挪用jni.h中封装好的大量函数 ,第二个参数代表着native要领的挪用者,当java代码中界说的native要领是静态要领时这里的参数是jclass,非静态要领的参数是jobject

接下来我们建设一个cpp文件,引用头文件并实现个中的函数,也就是native要领将要现实执行的逻辑:

#include "com_cn_jni_JniTest.h" 

#include <stdio.h> 

  

JNIEXPORT void JNICALL Java_com_cn_jni_JniTest_callCppMethod 

  (JNIEnv *, jclass) 

    printf("Print From Cpp: n"); 

    printf("I am a cpp method ! n"); 

在要领的实现中插手简朴的printf打印语句,在完成要领的实现后,我们必要将上面的cpp文件编译为动态链接库,提供应java中的native要领挪用,因此下面必要在window情形下安装gcc情形。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读