1.声明c++ 所需要的native方法供java调用
- javac Hello.java -h .
生成 c++ 的头文件
test_Hello.h 内容为
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class test_Hello */ #ifndef _Included_test_Hello #define _Included_test_Hello #ifdef __cplusplus extern "C" { #endif /* * Class: test_Hello * Method: helloFromCPP * Signature: ()V */ JNIEXPORT void JNICALL Java_test_Hello_helloFromCPP (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif |
- 编写c++ 代码
复制 test_Hello.h 后缀改为cpp 内容为
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> #include <stdio.h> #include "test_Hello.h" JNIEXPORT void JNICALL Java_test_Hello_helloFromCPP (JNIEnv *, jobject){ printf("%s","i am from c++");
} |
方法参数不能修改,只能修改函数体
- 使用 gcc 编译生成 hello.dll
下载
Mingw64 ,在该目录下cmd 命令行执行, 其中 -I参数为引入java框架 本地的c++ 头文件 -share 位输出 一个dll , 最后的参数为 cpp 实际的代码文件
gcc -I "D:\Program Files\Java\jdk1.8.0_201\include" -I "D:\Program Files\Java\jdk1.8.0_201\include\win32" -shared -o hello.dll D:\workspace\参考框架\test1\src\main\java\test\test_Hello.cpp
- 将生成好 hello.dll 放到java 工程的根路径
运行java代码
package org.example; import test.Hello; // MyJavaClass.java public class TestCallDll { public static void main(String[] args) { Hello a = new Hello(); a.helloFromCPP(); } } |
package test; public class Hello { public native void helloFromCPP(); static{ System.out.println(System.getProperty("user.dir")); System.load(System.getProperty("user.dir") + "\\hello.dll"); } } |
输出 c++ 的内容