JNI入门教程之HelloWorld篇一文中介绍了如何一步步编写JNI相关的应用程序,并没有更多的介绍相关的机制,本文主要介绍如何使用JNI把java程序和native程序结合起来。
当我们开始接触JNI但是还不熟悉的时候,也许会这样几个问题:
读完本文你将会明白如上问题的来龙去脉。首先我在重复一下如何编写JNI相关的应用程序,我们必须在java方法中声明一个native的方法,比如public native String getLine(String PRompt);这个方法具有的两个特点是,引入了要害字native,它的意思是这个方法的实现由其他的语言实现,比如c/c++等。另外这个方法是以分号结尾的,表明这个方法不包括实现。我们在上篇文章已经知道使用javah命令可以得到我们需要的header文件。下面给出java程序和相关的.h文件的代码
//Prompt.java
class Prompt {
private native String getLine(String prompt);
public static void main(String args[]) {
Prompt p = new Prompt();
String input = p.getLine("Type a line: ");
System.out.println("User typed: " + input);
}
static {
System.loadLibrary("prompt");
}
}
//Prompt.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Prompt */
#ifndef _Included_Prompt
#define _Included_Prompt
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Prompt
* Method: getLine
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Prompt_getLine
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
我们可以看到在Prompt.h文件中定义了我们要实现的函数的原型,我们主要关心两点一个是方法名称另一个是方法的参数,方法的名称为Java_Prompt_getLine,它是由如下四部分组成
看看方法的参数,由三个参数组成分别是JNIEnv *, jobject, jstring。JNIEnv是一个JNI接口指针,它事实上是由函数表组成的,我们可以使用JNIEnv来访问java对象。jobject是当前类的的引用,想当与java中的this。最后一个参数是jstring,代表了我们java方法中的String prompt。
在编写native方法的时候,无论是java基本类型还是对象我们都不能在c/c++中直接使用,必须要转成相对应得类型,下面给出基本数据类型的对应关系。
Java TypeNative TypeSize in bitsboolean
jboolean
8, unsignedbyte
jbyte
8char
jchar
16, unsignedshort
jshort
16int
jint
32long
jlong
64float
jfloat
32double
jdouble
64void
void
n/a
新闻热点
疑难解答