使用 NetBeans C/C++ Pack 5.5 开始 JNI,第二部分
http://www.netbeans.org/kb/55/beginning-jni-part2.html
作者: <script language="JavaScript" type="text/javascript"><!--var user = "dlipin";var domain = "netbeans.org";var at = "@";document.write('<a href="mailto:' + user + at + domain + '"><i>Dmitry Lipin</i></a>');//--></script>Dmitry Lipin 和 <script language="JavaScript" type="text/javascript"><!--var user = "ksorokin";var domain = "netbeans.org";var at = "@";document.write('<a href="mailto:' + user + at + domain + '"><i>Kirill Sorokin</i></a>');//--></script>Kirill Sorokin。
本教程将介绍一个示例应用程序的创建过程,该应用程序使用 JNI 执行一些使用 C 编程语言编写的本地代码。应用程序的 Java™ 部分使用 NetBeans™ IDE 5.5;C 部分则使用 NetBeans™ C/C++ Pack 5.5。
将从创建一个简单的 Java 项目开始,向它添加一个本地方法,然后使用 NetBeans C/C++ Pack 5.5 在 C 中实现该方法。
这是教程的第二部分,它包含了在 Sun™ Linux 操作系统中创建示例 JNI 应用程序的内容。
预期持续时间:30 分钟
本教程假定您已经具备了以下一些技术的基本知识或使用经验。
l C 编程语言
开始之前,您需要在计算机上安装以下软件:
l J2SE Development Kit (JDK™) 5.0 (下载)
l NetBeans IDE 5.5(下载)
l NetBeans C/C++ Pack 5.5 (下载)
l gcc, make
l <java_home></java_home> - JDK 安装目录
l <projects_root></projects_root> - 包含所创建 Java 项目的目录
该练习将指导您完成在开始本教程前要应用于系统的所需的配置更改。
将包含 gcc 和 make 实用程序的目录追加到 PATH 环境变量中。
启动 NetBeans IDE。
本练习的目的是创建和配置将要开发的 JNI 应用程序的 Java 部分。将要创建一个新的 Java 应用程序项目,初始化它的主类,并向该类添加本地方法。
<shape id="_x0000_i1029" style="WIDTH: 375pt; HEIGHT: 225pt" type="#_x0000_t75" alt="Code hine pop-up"><imagedata src="file:///C:/DOCUME~1/fujiang/LOCALS~1/Temp/msohtml1/01/clip_image005.png" o:href="http://www.netbeans.org/images/articles/55/beginning-jni-part2/figure-03.png"></imagedata></shape>
private native void nativePrint();
native 关键字表示该方法在外部本地库中拥有一个实现,这样代码就可以正确编译了。但是,在运行时,该库的位置不清楚。有关详细信息,请参阅下面的配置 Java 项目部分。
<java_home>/bin/javah -o HelloWorldNative.h -jni</java_home>
-classpath <projects_root>/HelloWorld/build/classes helloworld.Main</projects_root>
生成一个 HelloWorldNative.h C 头文件。要求为 nativePrint() 方法的本地实现提供正确的功能声明。
本练习创建了一个新的“通用 Java 应用程序项目”,指定了它的位置,并定义了项目主类的包和名称。还将一个新方法添加给了主类,并将它标记为一个拥有本地实现的方法。最后,我们创建了一个 C 头文件,该头文件在后面的本地库编译中会用到。
通过本练习,可以了解到示例应用程序本地部分的创建过程。您将创建 C++ 动态库项目,并对它进行配置,使其能够构建 JNI 代码。
设置项目之后,将为本地方法创建实现,这些方法已在早些时候在应用程序的 Java 部分进行了声明。
<java_home>/include, <java_home>/include/linux</java_home></java_home>
这些设置对于实现用 C 代码调用 Java jni.h 库是必要的。
这一步的目的是简化所得 SO 文件的路径,以使通过 Java 调用它更为简便。
<shape id="_x0000_i1034" style="WIDTH: 375pt; HEIGHT: 225pt" type="#_x0000_t75" alt="C/C++ Library Properties, Part 3"><imagedata src="file:///C:/DOCUME~1/fujiang/LOCALS~1/Temp/msohtml1/01/clip_image015.png" o:href="http://www.netbeans.org/images/articles/55/beginning-jni-part2/figure-08.png"></imagedata></shape>
<shape id="_x0000_i1035" style="WIDTH: 375pt; HEIGHT: 225pt" type="#_x0000_t75" alt="Creating a new C file"><imagedata src="file:///C:/DOCUME~1/fujiang/LOCALS~1/Temp/msohtml1/01/clip_image017.png" o:href="http://www.netbeans.org/images/articles/55/beginning-jni-part2/figure-09.png"></imagedata></shape>
#include <jni.h></jni.h>
#include <stdio.h></stdio.h>
#include "HelloWorldNative.h"
JNIEXPORT void JNICALL Java_helloworld_Main_nativePrint
(JNIEnv *env, jobject obj)
{
printf("/nHello World from C/n");
}
<shape id="_x0000_i1036" style="WIDTH: 375pt; HEIGHT: 225pt" type="#_x0000_t75" alt="Implementing the native method"><imagedata src="file:///C:/DOCUME~1/fujiang/LOCALS~1/Temp/msohtml1/01/clip_image019.png" o:href="http://www.netbeans.org/images/articles/55/beginning-jni-part2/figure-10.png"></imagedata></shape>
<shape id="_x0000_i1037" style="WIDTH: 375pt; HEIGHT: 225pt" type="#_x0000_t75" alt="Building the library"><imagedata src="file:///C:/DOCUME~1/fujiang/LOCALS~1/Temp/msohtml1/01/clip_image021.png" o:href="http://www.netbeans.org/images/articles/55/beginning-jni-part2/figure-11.png"></imagedata></shape>
在本练习中,创建了一个新的 C/C++ 动态库,指定了它的位置,并对它进行了配置,以便能够构建 Java 方法的 JNI 实现。为在 Java 应用程序中声明的本地方法添加生成的头文件并实现它。
本练习将完成对应用程序 Java 部分的一些最终更改。这是保证 Java 部分正确加载在前一个练习中编译的本地库所必需的。然后编译并运行最终的应用程序。
static {
System.load("<projects_root>/HelloWorldNative/dist/HelloWorldNative.so");</projects_root>
}
Hello World from C
BUILD SUCCESSFUL (total time: 0 seconds)
<shape id="_x0000_i1039" style="WIDTH: 375pt; HEIGHT: 225pt" type="#_x0000_t75" alt="Running the application"><imagedata src="file:///C:/DOCUME~1/fujiang/LOCALS~1/Temp/msohtml1/01/clip_image025.png" o:href="http://www.netbeans.org/images/articles/55/beginning-jni-part2/figure-13.png"></imagedata></shape>
本练习完成了一些最终的配置步骤,并运行了应用程序,以验证本地方法的实现来自本地 C 库。
可以从这里下载本教程的源代码。
可以使用以下文档获得更多信息:
l Getting Started With the NetBeans C/C++ Development Pack,NetBeans C/C++ Pack 5.5 教程
l Java Native Interface,Java Native Interface 5.0 规范