『阿男的技术分享』*Java Native Interface(上)*
2017-02-11 00:00
351 查看
『阿男的技术分享』*Java Native Interface(上)*
我们知道Java本身的实现,很大一部分是用C++写的。实际上,Java也允许我们和原生平台的代码进行交互。
Java定义了一个接口规范,就叫做
首先写一个Java的Class^1:
从上面的代码,我们看到一些平常写Java代码的时候不常看见的东西,首先是这个:
这个
这个
接下来我们用
我们得到了
可以看到上面的文件里自动生成了
我们知道Java本身的实现,很大一部分是用C++写的。实际上,Java也允许我们和原生平台的代码进行交互。
Java定义了一个接口规范,就叫做
Java Native Interface,通过这个接口规范,我们就可以让Java代码运行原生平台的代码。
首先写一个Java的Class^1:
public class HelloJNI { static { System.loadLibrary("hello"); // Load native library at runtime // hello.dll (Windows) or libhello.so (Unixes) } // Declare a native method sayHello() that receives nothing and returns void private native void sayHello(); // Test Driver public static void main(String[] args) { new HelloJNI().sayHello(); // invoke the native method } }
从上面的代码,我们看到一些平常写Java代码的时候不常看见的东西,首先是这个:
System.loadLibrary("hello");
这个
System.loadLibrary方法可以用来调用平台的原生库。然后是这个:
private native void sayHello();
这个
native关键字意味着这个代码的实现是原生平台实现,而不是Java代码。因此我们要做一个
hello库,提供这个
sayHello方法。
接下来我们用
javah命令生成
.h文件:
$ ls HelloJNI.java HelloJNI.java $ javah HelloJNI $ ls *.h HelloJNI.h
我们得到了
HelloJNI.h文件,它的内容是根据
HelloJNI.java生成的,我们看看里面的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloJNI */ #ifndef _Included_HelloJNI #define _Included_HelloJNI #ifdef __cplusplus extern "C" { #endif /* * Class: HelloJNI * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloJNI_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
可以看到上面的文件里自动生成了
JNI接口规范的一些约定代码。比如
jni.h这个是由JDK提供的,我们稍后要引用。还有
sayHello对应的
C/C++的方法是
Java_HelloJNI_sayHello,这个命名方式可以看出来是
Java_ClassName_MethodName,这个也是
JNI的约定。
相关文章推荐
- 『阿男的技术分享』*Java Native Interface(下)*
- JNI(Java Native Interface)技术在嵌入式软件开发中的应用
- java native interface(JNI)技术简单应用
- 【Java Native】【JNI技术的实践(使用VS2010)】
- 清华大学计算中心培训部-技术分享:提高自己Java水平的十大技术
- java常识: JNI=java native interface
- Java Native Interface: Programmer's Guide and Specification
- Java Native Interface(Java 调用Delphi、C、C++编写的DLL)
- 清华大学计算中心培训部-技术分享:java入门教程:浮点型(实型)数据
- 清华大学计算中心培训部-技术分享:Java基础教程:增强的for循环
- 清华大学计算中心培训部-技术分享:java入门教程:数据类型举例
- JNI - Java Native Interface
- Java Native Interface
- 清华大学计算中心培训部-技术分享:JAVA基础:常量与变量
- 清华大学计算中心培训部-技术分享:JAVA入门:简单的Java程序
- 清华大学计算中心培训部-技术分享:Java中Jlist的Swing组件
- Java Native Interface 入门示例
- 用Delphi开发JNI(Java+Native+Interface)应用
- Java Native Interface Specification contents——jni官方文档
- 清华大学计算中心培训部-技术分享:Java基础入门:不定长度参数