解秘java中native方法如何实现:手把手带你实现java native方法

解秘java中native方法如何实现:手把手带你实现java native方法,第1张

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 
/* 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又没说清楚这事由编译器办。所以搞得我很郁闷。找了大半个月,终于在一个很古老的网页上找到答案。

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


涉及到的所有文件如下:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/676244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存