public class Operation {
public native int add(int a, int b);
}
2、使用javah生成.h头文件
javah -jni Operation
生成的Operation.h文件内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class Operation */
#ifndef _Included_Operation
#define _Included_Operation
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Operation
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Operation_add
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
3、编写add方法的声明实现文件:dllmain.cpp
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "jni.h"
#include
#include "Operation.h"
JNIEXPORT jint JNICALL Java_Operation_add(JNIEnv* env, jobject obj, jint a, jint b) {
printf("%s", "call c++ native method!!");
return a + b;
}
int main(){
return 0;
}
4、编译成动态链接库(dll文件)
在windows上面编译cpp文件,需要先安装编译器,可以使用mingw或者visual studio,此处使用mingw,注意:因为java安装的是64位,MinGW也必须使用64位,否则会报Can’t load IA 32-bit .dll on a AMD 64-bit platform的错误。
MinGW如何安装可以参考:https://blog.csdn.net/qq_29212901/article/details/109303983
gcc -I/c/jdk1.8.0_212/include -I/c/jdk1.8.0_212/include/win32 -Wl,--add-stdcall-alias -shared -o dllmain.dll dllmain.cpp
参数:-Wl,–add-stdcall-alias 可以为函数加上标准调用前缀(stdcall @nn)。
这样编译出的dll就可以了。都知道win32中dll中的函数要求有标准调用前缀,在JNI中不方便手动处理这个,Sun又没说清楚这事由编译器办。所以搞得我很郁闷。找了大半个月,终于在一个很古老的网页上找到答案。
public class NativeDemo {
static {
System.loadLibrary("dllmain");
}
public static void main(String[] args) {
System.out.println(new Operation().add(1, 3));
}
}
6、运行结果如下:
涉及到的所有文件如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)