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方法相关推荐

  1. java中的进制输出转换_Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

  2. Java中FTPClient上传中文目录、中文文件名乱码问题解决方法

    Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 参考文章: (1)Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 (2)https://www.cnblog ...

  3. Java 中子类是否只继承父类的非私有变量和方法?

    今天在 CSDN 论坛中见到有人问在 Java 中子类是否只继承父类的非私有变量和方法(原贴在此).大部分跟贴都认为这句话是正确的,但是对于这个问题背后的本质理解却是错误的. 首先我们明确一下&quo ...

  4. java中demo接人_return的用法_如何理解java中return的用法?

    C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...

  5. 【手把手带你学Java EE】多线程那些事,你了解了吗?

    [手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...

  6. java中遍历树形菜单,你可能不知道还有这样的方法

    版权声明:本文为CSDN博主「穆雄雄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/qq_34137397/ ...

  7. 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用

    反射的概念 反射:Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成 ...

  8. Java中出现No enclosing instance of type Demo01 is accessible解决方法参考

    出现类似以下错误 No enclosing instance of type Demo01 is accessible. Must qualify the allocation with an enc ...

  9. java中execution的作用_一文初步了解Java虚拟机

    大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 什么是JVM? JVM(Java Virtual Machin ...

  10. Java中HashMap和TreeMap的区别深入理解,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

最新文章

  1. GPT-3:人工智能的新突破
  2. MATLAB与Python numpy矩阵操作对应表
  3. python编程从入门到实践课后题答案-python编程:从入门到实践习题5-8~5-11
  4. 区块链BaaS云服务(14)华大BGI区块链“Baas接口“
  5. tf.Variable()、tf.get_variable()
  6. mybatis里的日志动态代理
  7. UFLDL教程: Exercise: Sparse Autoencoder
  8. 【转载】【面试题】你是一个测试工程师,如何保证软件质量?
  9. 县级的图书馆计算机管理员,图书馆管理员的岗位职责
  10. mysql安装过程遇到的问题_个人在mysql安装过程中遇见的问题
  11. android 微信支付测试,求大神指导一下!!!android开发,测试demo按步骤配置,无法调用到微信支付...
  12. 渠道是创业企业与消费者或者用户建立联系的桥梁
  13. 三、optimizer_trace分析
  14. 搭建Cocos2d-js开发环境(Window)
  15. 解决iText 5.0.1生成pdf,加入iTextAsian.jar 出现异常 Font 'STSong-Light' with 'UniGB-UCS2-H'...
  16. PromQL 直方图 跟踪请求的延迟或响应大小 99%的请求是在多少延迟下完成的?
  17. 穷查理宝典-读书笔记
  18. android国外网站
  19. 计算机专业简历教育背景怎么写,简历中教育背景怎么写?填写教育背景注意事项...
  20. Ubuntu16.04下ROS Kinetic的安装(2022)

热门文章

  1. 自主招生计算机网测,自主招生考试中,笔试和机试有什么区别?
  2. lgg7刷机包下载_LG G7 恢复Download回官方。
  3. python结巴分词_Python中文分词工具之结巴分词用法实例总结【经典案例】
  4. web前端常用开发工具有哪些?
  5. win10安装vc2015失败,尝试解决方案,目前有效
  6. python三维建模可以加 贴图_三维模型都有哪些绘制贴图的软件??
  7. JDK如何安装与配置环境变量
  8. MySQL数据增加语句
  9. Junit 4 与Junit 5区别
  10. 优思学院|2021中质协六西格玛绿带考题及答案