解秘java中native方法如何实现:手把手带你实现java native方法
Posted 东心十
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解秘java中native方法如何实现:手把手带你实现java native方法相关的知识,希望对你有一定的参考价值。
1、新建Operation.java文件
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 <jni.h>
/* 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 <stdio.h>
#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又没说清楚这事由编译器办。所以搞得我很郁闷。找了大半个月,终于在一个很古老的网页上找到答案。
5、写一个测试代码调用上面编写的native add方法 NativeDemo.java
public class NativeDemo
static
System.loadLibrary("dllmain");
public static void main(String[] args)
System.out.println(new Operation().add(1, 3));
6、运行结果如下:
涉及到的所有文件如下:
以上是关于解秘java中native方法如何实现:手把手带你实现java native方法的主要内容,如果未能解决你的问题,请参考以下文章