解秘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、运行结果如下:

result
涉及到的所有文件如下:
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东心十

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值