java措施挪用c++代码是你必要把握的
起首界说一个包括了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情形。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |