In this step, you use the
Run
eg. Content of javah file:
javah
utility program to generate a C header file (a .h
file) from the HelloWorld
Java class. The header file defines a structure that represents the HelloWorld
class on the C side, and provides a C function definition for the implementation of the native method displayHelloWorld()
defined in that class. Run
javah
now on the HelloWorld
class that you created in the previous steps. For example, on UNIX you would issue the following command to your favorite shell tool. By default,% javah HelloWorld
javah
places the new .h
file in the same directory as the .class
file. You can tell javah
to place the header files in a different directory with the -d
option. The name of the header file is the Java class name with a .h
appended to the end of it. For example, the command shown above will generate a file named HelloWorld.h
.eg. Content of javah file:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <native.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld typedef struct ClassHelloWorld { char PAD; /* ANSI C requires structures to have a least one member */ } ClassHelloWorld; HandleTo(HelloWorld); extern void HelloWorld_displayHelloWorld(struct HHelloWorld *); #endif
The Class Structure
Look at the header file. Notice that it contains a struct definition for a structure namedClassHelloWorld
. The members of this structure parallel the members of the corresponding Java class; that is to say, the fields in the struct correspond to instance variables in the class. But sinceHelloWorld
doesn't have any instance variables, there is just a place holder in the structure. You can use the members of the struct to reference class instance variables from your C functions.
The Function Definition
In addition to the C structure that mimics the Java class, you will also notice a C function signature that looks like this:This is the definition for the C function that you will write in Step 5: Write the C Function that provides the implementation for theextern void HelloWorld_displayHelloWorld(struct HHelloWorld *);HelloWorld
class's native methoddisplayHelloWorld()
. You must use this function signature when you write the implementation for the native method. IfHelloWorld
contained any other native methods, their function signatures would appear here as well. The name of the C function that implements the native method is derived from the package name, the class name, and the name of the Java native method. Thus, the native methoddisplayHelloWorld()
within theHelloWorld
class becomesHelloWorld_displayHelloWorld()
. In our example, there is no package name becauseHelloWorld
is in the default package.
You will notice that the C function accepts a single parameter even though the native method defined in the Java class accepted none. You can think of the parameter as the "this" variable in C++. Our example ignores the "this" parameter. However, the next lesson, , describes how to access the data in the "this" parameter.
No comments:
Post a Comment