解秘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方法的主要内容,如果未能解决你的问题,请参考以下文章

手把手带你实现符合Promise/A+规范的Promise

算法实践| 手把手带你实现快速排序算法

手把手带你手写SpringMVC,剑指优秀开源框架灵魂

手把手带你用Java爬取网站数据

超详细的Java开发环境搭建指南(手把手带你开发第一个Java程序)

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单手把手教程+完整代码