解秘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方法相关推荐
- java中的进制输出转换_Java I/O : Java中的进制详解
作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...
- Java中FTPClient上传中文目录、中文文件名乱码问题解决方法
Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 参考文章: (1)Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 (2)https://www.cnblog ...
- Java 中子类是否只继承父类的非私有变量和方法?
今天在 CSDN 论坛中见到有人问在 Java 中子类是否只继承父类的非私有变量和方法(原贴在此).大部分跟贴都认为这句话是正确的,但是对于这个问题背后的本质理解却是错误的. 首先我们明确一下&quo ...
- java中demo接人_return的用法_如何理解java中return的用法?
C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...
- 【手把手带你学Java EE】多线程那些事,你了解了吗?
[手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...
- java中遍历树形菜单,你可能不知道还有这样的方法
版权声明:本文为CSDN博主「穆雄雄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/qq_34137397/ ...
- 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用
反射的概念 反射:Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成 ...
- Java中出现No enclosing instance of type Demo01 is accessible解决方法参考
出现类似以下错误 No enclosing instance of type Demo01 is accessible. Must qualify the allocation with an enc ...
- java中execution的作用_一文初步了解Java虚拟机
大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 什么是JVM? JVM(Java Virtual Machin ...
- Java中HashMap和TreeMap的区别深入理解,java开发面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
最新文章
- GPT-3:人工智能的新突破
- MATLAB与Python numpy矩阵操作对应表
- python编程从入门到实践课后题答案-python编程:从入门到实践习题5-8~5-11
- 区块链BaaS云服务(14)华大BGI区块链“Baas接口“
- tf.Variable()、tf.get_variable()
- mybatis里的日志动态代理
- UFLDL教程: Exercise: Sparse Autoencoder
- 【转载】【面试题】你是一个测试工程师,如何保证软件质量?
- 县级的图书馆计算机管理员,图书馆管理员的岗位职责
- mysql安装过程遇到的问题_个人在mysql安装过程中遇见的问题
- android 微信支付测试,求大神指导一下!!!android开发,测试demo按步骤配置,无法调用到微信支付...
- 渠道是创业企业与消费者或者用户建立联系的桥梁
- 三、optimizer_trace分析
- 搭建Cocos2d-js开发环境(Window)
- 解决iText 5.0.1生成pdf,加入iTextAsian.jar 出现异常 Font 'STSong-Light' with 'UniGB-UCS2-H'...
- PromQL 直方图 跟踪请求的延迟或响应大小 99%的请求是在多少延迟下完成的?
- 穷查理宝典-读书笔记
- android国外网站
- 计算机专业简历教育背景怎么写,简历中教育背景怎么写?填写教育背景注意事项...
- Ubuntu16.04下ROS Kinetic的安装(2022)