您的位置:首页 > 编程语言 > Java开发

『阿男的技术分享』*Java Native Interface(上)*

2017-02-11 00:00 351 查看
『阿男的技术分享』*Java Native Interface(上)*

我们知道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
的约定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: