整个工程下需要的文件:

先来写一下Java的类代码:Sample1.java
点击(此处)折叠或打开
- public
class Sample1{
- public nativeint intMethod(int n);
- public nativeboolean booleanMethod(boolean bool);
- public nativeString stringMethod(Stringtext);
- public nativeint intArrayMethod(int[]
intArray);
-
- public staticvoid main(String[]
args)
- {
- System.loadLibrary("SampleC");
//DLL库的名字(C语言Windows XP下)
- Sample1 sample=
new Sample1();
-
- int square
= sample.intMethod(5);
- boolean bool
= sample.booleanMethod(true);
- String
text = sample.stringMethod("java");
- int sum= sample.intArrayMethod(newint[]{1,2,3,4,5,6,7,8,13});
-
- System.out.println("intMethod: "+
square);
- System.out.println("booleanMethod:"+
bool);
- System.out.println("stringMethod:"+text);
- System.out.println("intArrayMethod:"+sum);
-
- }
-
- }
提供一个bat文件编译:JavaMakeUp.bat
点击(此处)折叠或打开
- set JAVABIN=D:\ProgramJava\Java\jdk1.6.0_30\bin
- set classpath=.;D:\ProgramJava\Java\jdk1.6.0_30\lib
- set PATH=%JAVABIN%
- javac -classpath
-Xlint:unchecked
-verbose *.java
- pause
然后双击 JavaMakeUp.bat:
就可以编译出Sample1.class。
Java还有一个强大功能就是根据.calss生成C和C++使用的.h文件文件:
指令如下:
>javah Sample1
生成的.h文件如下:Sample1.h
点击(此处)折叠或打开
- /*DONOT EDIT THIS FILE- itis
machine generated*/
- #include <jni.h>
- /* Headerforclass Sample1*/
- #ifndef _Included_Sample1
- #define _Included_Sample1
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: Sample1
- * Method: intMethod
- * Signature:(I)I
- */
- JNIEXPORT jint JNICALL Java_Sample1_intMethod
- (JNIEnv *, jobject, jint);
- /*
- * Class: Sample1
- * Method: booleanMethod
- * Signature:(Z)Z
- */
- JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod
- (JNIEnv *, jobject, jboolean);
- /*
- * Class: Sample1
- * Method: stringMethod
- * Signature:(Ljava/lang/String;)Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
- (JNIEnv *, jobject, jstring);
- /*
- * Class: Sample1
- * Method: intArrayMethod
- * Signature:([I)I
- */
- JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod
- (JNIEnv *, jobject, jintArray);
- #ifdef __cplusplus
- }
- #endif
- #endif
下面就是写C语言代码了:
使用VC++6.0编写和编译:
SampleC.cpp:
点击(此处)折叠或打开
- #include <stdio.h>
- #include <string.h>
- #include "Sample1.h"
- #if 1
- /*
- * Class: Sample1
- * Method: intMethod
- * Signature:(I)I
- */
- JNIEXPORT jint JNICALL Java_Sample1_intMethod
- (JNIEnv *env, jobject obj, jint num)
- {
- return num*num;
- }
- /*
- * Class: Sample1
- * Method: booleanMethod
- * Signature:(Z)Z
- */
- JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod
- (JNIEnv *env, jobject obj, jboolean boolean)
- {
- return !boolean;
- }
- /*
- * Class: Sample1
- * Method: stringMethod
- * Signature:(Ljava/lang/String;)Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
- (JNIEnv *env, jobject obj, jstringstring)
- {
- const char
*str=env->GetStringUTFChars(string, 0);
- char cap[128];
- strcpy(cap, str);
- env->ReleaseStringUTFChars(string, 0);
- return env->NewStringUTF(strupr(cap));
- }
- /*
- * Class: Sample1
- * Method: intArrayMethod
- * Signature:([I)I
- */
- JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod
- (JNIEnv *env, jobject obj, jintArrayarray)
- {
- int i, sum=0;
- jsize len
= env->GetArrayLength(array);
- jint *body=env->GetIntArrayElements(array,
0);
- for(i=0; i<len;
i++)
- {
- sum += body[i];
- }
- env->ReleaseIntArrayElements(array, body,
0);
- return sum;
- }
- #endif
VCMakeUp.bat:
点击(此处)折叠或打开
- set VCBIN=D:\Microsoft Visual Studio\VC98\Bin
- set INCLUDE=D:\Microsoft Visual Studio\VC98\Include
- set LIB=D:\Microsoft Visual Studio\VC98\Lib
- set JAVA_HOME=D:\ProgramJava\Java\jdk1.6.0_30
- set PATH=%VCBIN%
- cl /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32 /c*.cpp
- cl /LD /I$%JAVA_HOME%\include /I%JAVA_HOME%\include\win32*.obj /FeSampleC.DLL
编译出DLL运行既可。
运行指令:
>java Sample1
结果如下:
D:\NewLandWork_LANPENG\Lan_POS_LIB\Java-C>java Sample1
intMethod: 25
booleanMethod:false
stringMethod:JAVA
intArrayMethod:49

本文详细介绍了如何在Java中调用C/C++库,并通过生成的.h文件实现C/C++对Java类的方法调用,以及如何在C/C++中调用Java类的方法。包括Java类的编写、编译、生成.h文件、C/C++代码实现及编译过程,最终演示了Java与C/C++之间的调用效果。
216

被折叠的 条评论
为什么被折叠?



