在 Linux 平台下使用 JNI

在 Linux 平台下使用 JNI

ID:38746773

大小:54.00 KB

页数:5页

时间:2019-06-18

在 Linux 平台下使用 JNI_第1页
在 Linux 平台下使用 JNI_第2页
在 Linux 平台下使用 JNI_第3页
在 Linux 平台下使用 JNI_第4页
在 Linux 平台下使用 JNI_第5页
资源描述:

《在 Linux 平台下使用 JNI》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、实现步骤及相关函数使用本文将一步步说明在Linux平台下如何实现本地共享库与Java协同工作。HelloWorld程序是目前标准的入门第一步,那么,我也以类似的应用最为样例。第一步,定义一个Java类--Hello.它提供SayHello方法:此时应注意两点:1.为要使用的每个本地方法编写本地方法声明,其声明方式与普通Java方法接口没什么不同,只是必须指定native关键字,如下所示:publicnativevoidSayHello(StringstrName);在这个函数中,我们将根据传进的人名,向某人问好。2.必须显式地加载本地代码库。我们需在类

2、的一个静态块中加载这个库:static { System.loadLibrary("hello"); }再加上必要的异常处理就生成如下源文件Hello.java:publicclassHello { static { try { //此处即为本地方法所在链接库名 System.loadLibrary("hello"); } catch(UnsatisfiedLinkErrore) { System.err.println("Cannotloadhellolibrary:"+ e.toString()); } } publicHello() { }

3、//声明的本地方法 publicnativevoidSayHello(StringstrName); }编译后生成Hello.class文件。第二步,生成本地链接库。具体过程如下:1.要为以上定义的类生成Java本地接口头文件,需使用javah,Java编译器的javah功能将根据Hello类生成必要的声明,此命令将生成Hello.h文件,我们在共享库的代码中要包含它,javah不使默认内部命令,需要指明路径,它在JDK的bin目录下,在我的Linux环境下命令如下:/home/jbuilder/jdk1.3.1/bin/javahHello生成的He

4、llo.h文件内容如下所示:/*DONOTEDITTHISFILE-itismachinegenerated*/ #include /*HeaderforclassHello*/ #ifndef_Included_Hello #define_Included_Hello #ifdef__cplusplus extern"C"{ #endif /* *Class:Hello *Method:SayHello *Signature:(Ljava/lang/String;)V */ JNIEXPORTvoidJNICALLJava_Hello_

5、SayHello (JNIEnv*,jobject,jstring); #ifdef__cplusplus } #endif #endif2.在与Hello.h相同的路径下创建一个CPP文件Hello.cpp。内容如下:#include"Hello.h" #include //与Hello.h中函数声明相同 JNIEXPORTvoidJNICALLJava_Hello_SayHello(JNIEnv*env,jobjectarg,jstringinstring) { //从instring字符串取得指向字符串UTF编码的指针 cons

6、tjbyte*str= (constjbyte*)env->GetStringUTFChars(instring,JNI_FALSE); printf("Hello,%s",str); //通知虚拟机本地代码不再需要通过str访问Java字符串。 env->ReleaseStringUTFChars(instring,(constchar*)str); return; }所有的JNI调用都使用了JNIEnv*类型的指针,习惯上在CPP文件中将这个变量定义为evn,它是任意一个本地方法的第一个参数。env指针指向一个函数指针表,在VC中可以直接用"-

7、>"操作符访问其中的函数。jobject指向在此Java代码中实例化的Java对象LocalFunction的一个句柄,相当于this指针。后续的参数就是本地调用中有Java程序传进的参数,本例中只有一个String型参数。对于字符串型参数,因为在本地代码中不能直接读取Java字符串,而必须将其转换为C/C++字符串或Unicode。以下是三个我们经常会用到的字符串类型处理的函数:constchar*GetStringUTFChars(jstringstring,jboolean*isCopy)返回指向字符串UTF编码的指针,如果不能创建这个字符数组,

8、返回null。这个指针在调用ReleaseStringUTFChar()函数之前一直有效。参数

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。