MyNativeCpp是一个为项目MyNativeJava提供native方法的动态库工程。
使用环境
- 环境 win7 64位系统
- java: IDEA 2018.1 + jdk1.8
- c++ : CLion 2018.2 + mingw-w64
- 依赖库及文件
- %JAVA_HOME%\lib\jvm.lib
- %JAVA_HOME%\include;%JAVA_HOME%\include\jni.h
- %JAVA_HOME%\include;%JAVA_HOME%\include\win32\jni_md.h
- jni概述
- native接口文件
- 动态库提供本地方法
- java使用本地方法
待补充
参考
include目录下javah生成的接口文件,具体操作参见native接口生成。
接口文件会逐步更新,主要用于测试
#include <jni.h>
/* Header for class com_ft_mynative_MyNativeJava */
#ifndef _Included_com_ft_mynative_MyNativeJava
#define _Included_com_ft_mynative_MyNativeJava
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ft_mynative_MyNativeJava
* Method: fun
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_ft_mynative_MyNativeJava_fun
(JNIEnv *, jobject);
/*
* Class: com_ft_mynative_MyNativeJava
* Method: fun2
* Signature: (Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_ft_mynative_MyNativeJava_fun2
(JNIEnv *, jobject, jstring);
/*
* Class: com_ft_mynative_MyNativeJava
* Method: fun3
* Signature: ([Ljava/lang/Integer;)V
*/
JNIEXPORT void JNICALL Java_com_ft_mynative_MyNativeJava_fun3
(JNIEnv *, jobject, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif
CLion生成动态库,jdk是64位,原本使用的Mingw是32位程序,生成的dll在64位java程序中不能使用, 又下载了mingw64,配置使CLion使用64位mingw,CLion使用CMake编译程序。
cmake_minimum_required(VERSION 3.12)
project(MyNativeJava)
set(CMAKE_CXX_STANDARD 14)
set(INC_DIR D:/java/jdk1.8.0_192/include;D:/java/jdk1.8.0_192/include/win32;../include)
set(LINK_DIR D:/java/jdk1.8.0_192/lib)
set(SOURCE_FILES com_ft_mynative_MyNativeJava.cpp com_ft_mynative_MyNativeJava.h)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../../MyNativeJava")
include_directories(${INC_DIR})
link_directories(${LINK_DIR})
link_libraries(jvm jawt)
add_library(MyNativeJava SHARED com_ft_mynative_MyNativeJava.cpp com_ft_mynative_MyNativeJava.h)
生成的dll直接指定输出到MyNativeJava目录下,CMakeLists.txt中设置set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../../MyNativeJava"),需要MyNativeJava与MyNativeCpp放在一个目录下。 具体方法请参考源代码
详情参见java调用动态库
静态块加载dll
public class MyNativeJava {
static {
System.loadLibrary("libMyNativeJava");
}
}
加载成功就可以使用native方法了,fun,fun2,fun3是测试用的几个方法,后续会加入更多内容,比如类成员修改,类方法执行等。 详情参见MyNativeJava.java
public class MyNativeJava {
static {
System.loadLibrary("libMyNativeJava");
}
private native void fun();
private native int fun2(String s);
private native void fun3(Integer[] ia);
public static void main(String[] args) {
MyNativeJava nativeHello = new MyNativeJava();
nativeHello.fun();
System.out.println(nativeHello.fun2("hello, tom"));
nativeHello.fun3(new Integer[]{3, 5});
}
}