自己实现一个Native方法(linux版)
来源:互联网 发布:aerial for windows 编辑:程序博客网 时间:2024/04/29 10:03
参照五月的仓颉的windows版本实现。http://www.cnblogs.com/xrq730/p/4824024.html
JNI
Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此Java提供了JNI来实现对于底层的访问。JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库,本地程序中的函数也可以调用Java层的函数,即JNI实现了Java和本地代码间的双向交互。
Native
JDK开放给用户的源码中随处可见Native方法,被Native关键字声明的方法说明该方法不是以Java语言实现的,而是以本地语言实现的,Java可以直接拿来用。本地语言这四个字,应该就是可以和操作系统直接交互的语言。
通过JNI调用C++写的代码
下面演示一下如何写一段简单的C++代码,在Java中用一个Native方法去调用的步骤。接下来一步一步演示一下:
1、写一段Java代码。由于我们在linux环境下,所以用的是一个.so文件。最后C++代码写完之后要生成一个.so文件,生成的文件可以使用static动态加载的方法加载进来,也可以通过配置环境变量的方式,这里选择前者。
public class TestMain{ static { System.load("/tmp/test/Hello.so"); } public native static void Hello(); public static void main(String[] args) { Hello(); }}2、编译java代码:javac TestMain.java
3、运行:“javah -jni TestMain”,表示为指定的类下的Native方法生成.h文件。.h文件是C/C++使用的头文件。此时在该目录下会生成一个TestMain.h头文件,这个命名是javah这个命令的实现帮我们命名的,只要多了这个文件就可以了。
4、然后在该目录下添加Hello.cpp源文件。文件内容为:
#include <iostream>#include "TestMain.h"using namespace std;JNIEXPORT void JNICALL Java_TestMain_Hello (JNIEnv *, jclass){ cout << "Hello,zcy!" << endl;}
5、修改TestMain.h头文件路径。将 #include <jin.h> 修改为 #include "/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/jni.h",后者是在linux下安装jar的安装位置。
6、编译C++源码为动态库。g++ Hello.cpp -fpic -shared -o Hello.so
7、经过上面一步,在源码目录下会生成Hello.so动态库文件。
8、执行。结果为:
- 自己实现一个Native方法(linux版)
- 自己实现一个Native方法的调用
- 自己实现一个Native方法的调用
- 自己实现一个Native方法的调用
- 自己实现的一个Native方法的调用
- 自己编写一个native方法
- JAVA中native方法(实现例子)
- reverse方法(自己实现)
- 自己实现 React Native 的Alert
- 【装饰设计模式】写一个MyBufferedReader实现自己的ReadLine方法、增强BufferedReader的ReaderLine()
- 自己实现的一个对窗体的资源化方法。
- 写一个循环方法(自己玩)
- native方法的实现过程
- 自己实现一个release版的TRACE
- 自己实现的一个java版ngrok
- 自己实现一个简单版的HashMap
- 建设一个自己的Linux发行版
- 自己实现一个Factory
- tyvj1391 走廊泼水节
- java自动处理unicode形式的字符串
- 负数的表示方法
- php不能获取linux CPU、内存等实时信息解决方法
- JAVA8 十大新特性详解
- 自己实现一个Native方法(linux版)
- Java中的synchronized、ReentrantLock两种锁对比
- 最新学习的资料,需要在这里记录一下了。lampp 上安装imagick
- web service开发 java
- HTML5学习_day05(4)--html之float具体表现
- 关于在Drupal中使用REST Server 增加node时有taxonomy_term 和 node reference的解决方法
- EJB的约束
- 小代码集合
- javascript中的原型链深入理解