Java native HelloWorld
来源:互联网 发布:炫浪网络社区小说 编辑:程序博客网 时间:2024/06/05 16:21
native方法的声明只需要在签名式前添加native关键字。
在java中实现一个native方法的主要流程如下:
1.声明native方法;
2.使用javac编译java源码文件,生成字节码文件(.class);
3.使用javah生成native方法的头文件(.h);
4.创建相应的.c文件,实现.h文件中声明的native函数;
5.使用gcc编译.c文件,生成.so文件(linux系统中的动态库)
6.在java源文件中添加静态的加载上述so文件的代码。(熟悉这个流程后,这个步骤可以在第一步编辑java源文件时完成。
依上述步骤,实现一个HelloWorld的例子。
第一步、编辑HelloWorld.java文件:
public class HelloWorld{ public native void print(); public static void main(String argv[]){ HelloWorld hw = new HelloWorld(); System.out.println("In Java, before native"); hw.print(); System.out.println("In Java, after native"); } static { System.loadLibrary("HelloWorld"); }}第二步、编译java源文件:
$javac HelloWorld.java$ls <= 当前应该只有HelloWorld.java和HelloWorld.class两个文件第三步、使用javah生成native方法的C语言函数声明(.h文件)
$javah -jni HelloWorld$ls <= 此时应该增加了一个HelloWorld.h文件$cat -n HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: print * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_print (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif第四步、编辑HelloWorld.c文件,实现上述头文件中声明的函数
#include "stdio.h"#include "HelloWorld.h"JNIEXPORT void JNICALL Java_HelloWorld_print (JNIEnv *jenv, jobject jobj){ int i = 0; printf("In native: Hello World!\n"); for(i = 0; i < 5; i++) printf("In native: loop %d\n", i);// fflush(stdout);}第五步、编译HelloWorld.c,生成libHelloWorld.so文件
$gcc HelloWorld.c -g -I%JAVA_HOME%/include -I%JAVA_HOME%/include/linux-fPIC -shared -o libHelloWorld.so <=需用自己的java安装路径替换上面的%JAVA_HOME%,该步骤之后,会生成libHelloWorld.so文件至此所有编译工作完成,使用java命令运行.class文件,JVM会自动加载libHelloWorld.so
$java HelloWorldInJava, before nativeInnative: Hello World!Innative: loop 0Innative: loop 1Innative: loop 2Innative: loop 3Innative: loop 4InJava, after native
这样,native的代码的生成,编辑,编译,运行流程至此结束。
另外还有一个有用的java族命令,javap可以用来反编译class文件。当在native层的代码中需要调用java方法时,需要知道java方法的签名式。javap也可以用来生成java方法的签名式
$javap -s HelloWorldCompiledfrom "HelloWorld.java"publicclass HelloWorld {publicHelloWorld();Signature:()Vpublicnative void print();Signature:()Vpublicstatic void main(java.lang.String[]);Signature:([Ljava/lang/String;)Vstatic{};Signature:()V}
0 0
- Java native HelloWorld
- Part1. JNI(Java Native Interface)介绍和HelloWorld程序编写
- react native之helloworld
- 【React Native】Running Helloworld
- React Native HelloWorld初探
- React-native之 helloworld
- 学习React Native(二)HelloWorld
- [React-Native]环境配置&HelloWorld
- React Native HelloWorld for mac
- webView 实现 与 javascript调用java方法(也称js调用native 方法) helloworld
- webView 实现 与 javascript调用java方法(也称js调用native 方法) helloworld
- HelloWorld.java
- Java HelloWorld
- java helloworld
- helloworld.java
- java helloworld
- JAVA ,HelloWorld
- Java HelloWorld
- Nutch 快速入门(Nutch 2.2.1)
- 第三章 处理器调度与死锁--笔记
- 关于JNDI,tomcat,jsp的一个小实例
- iOS事件传递
- 使用正确的姿势更新SSIS Data Flow Component以适应字段类型变化
- Java native HelloWorld
- 关于Css控制Web打印
- 九月十七日:安卓发包后的小结
- 一个基于svg的圆形loading动画
- sqoop工具使用大全
- hdu5433 BFS
- hadoop2.2.0伪分布安装
- 安卓Relativelayout 常用属性
- 我已经慢慢感觉到