Java和C语言混合编程--Windows版

来源:互联网 发布:javascript:; 编辑:程序博客网 时间:2024/06/04 18:32

整个工程下需要的文件:





先来写一下Java的类代码:Sample1.java

点击(此处)折叠或打开

  1. public class Sample1{
  2.     public nativeint intMethod(int n);
  3.     public nativeboolean booleanMethod(boolean bool);
  4.     public nativeString stringMethod(Stringtext);
  5.     public nativeint intArrayMethod(int[] intArray);
  6.     
  7.     public staticvoid main(String[] args)
  8.     {
  9.         System.loadLibrary("SampleC"); //DLL库的名字(C语言Windows XP下)
  10.         Sample1 sample= new Sample1();
  11.         
  12.         int square = sample.intMethod(5);
  13.         boolean bool = sample.booleanMethod(true);
  14.         String text = sample.stringMethod("java");
  15.         int sum= sample.intArrayMethod(newint[]{1,2,3,4,5,6,7,8,13});
  16.         
  17.         System.out.println("intMethod: "+ square);
  18.         System.out.println("booleanMethod:"+ bool);
  19.         System.out.println("stringMethod:"+text);
  20.         System.out.println("intArrayMethod:"+sum);
  21.         
  22.     }
  23.     
  24. }
然后编译Sample1.java
提供一个bat文件编译:JavaMakeUp.bat

点击(此处)折叠或打开

  1. set JAVABIN=D:\ProgramJava\Java\jdk1.6.0_30\bin
  2. set classpath=.;D:\ProgramJava\Java\jdk1.6.0_30\lib


  3. set PATH=%JAVABIN%
  4. javac -classpath -Xlint:unchecked -verbose *.java
  5. pause
将 JAVABIN 和classpath 设置为你们自己的Java路径。
然后双击 JavaMakeUp.bat:
就可以编译出Sample1.class。
Java还有一个强大功能就是根据.calss生成C和C++使用的.h文件文件:
指令如下:
>javah  Sample1
生成的.h文件如下:Sample1.h

点击(此处)折叠或打开

  1. /*DONOT EDIT THIS FILE- itis machine generated*/
  2. #include <jni.h>
  3. /* Headerforclass Sample1*/

  4. #ifndef _Included_Sample1
  5. #define _Included_Sample1
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10.  * Class: Sample1
  11.  * Method: intMethod
  12.  * Signature:(I)I
  13.  */
  14. JNIEXPORT jint JNICALL Java_Sample1_intMethod
  15.   (JNIEnv *, jobject, jint);

  16. /*
  17.  * Class: Sample1
  18.  * Method: booleanMethod
  19.  * Signature:(Z)Z
  20.  */
  21. JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod
  22.   (JNIEnv *, jobject, jboolean);

  23. /*
  24.  * Class: Sample1
  25.  * Method: stringMethod
  26.  * Signature:(Ljava/lang/String;)Ljava/lang/String;
  27.  */
  28. JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
  29.   (JNIEnv *, jobject, jstring);

  30. /*
  31.  * Class: Sample1
  32.  * Method: intArrayMethod
  33.  * Signature:([I)I
  34.  */
  35. JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod
  36.   (JNIEnv *, jobject, jintArray);

  37. #ifdef __cplusplus
  38. }
  39. #endif
  40. #endif
请大家支持一下我的 商城: www.yangcheng520.com  谢谢了。
下面就是写C语言代码了:
使用VC++6.0编写和编译:
SampleC.cpp:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "Sample1.h"


  4. #if 1

  5. /*
  6.  * Class: Sample1
  7.  * Method: intMethod
  8.  * Signature:(I)I
  9.  */
  10. JNIEXPORT jint JNICALL Java_Sample1_intMethod
  11.   (JNIEnv *env, jobject obj, jint num)
  12. {
  13.     return num*num;
  14. }


  15. /*
  16.  * Class: Sample1
  17.  * Method: booleanMethod
  18.  * Signature:(Z)Z
  19.  */
  20. JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod
  21.   (JNIEnv *env, jobject obj, jboolean boolean)
  22. {
  23.     return !boolean;
  24. }

  25. /*
  26.  * Class: Sample1
  27.  * Method: stringMethod
  28.  * Signature:(Ljava/lang/String;)Ljava/lang/String;
  29.  */
  30. JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
  31.   (JNIEnv *env, jobject obj, jstringstring)
  32. {
  33.     const char *str=env->GetStringUTFChars(string, 0);
  34.     char cap[128];
  35.     strcpy(cap, str);
  36.     env->ReleaseStringUTFChars(string, 0);
  37.     return env->NewStringUTF(strupr(cap));
  38. }

  39. /*
  40.  * Class: Sample1
  41.  * Method: intArrayMethod
  42.  * Signature:([I)I
  43.  */
  44. JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod
  45.   (JNIEnv *env, jobject obj, jintArrayarray)
  46. {
  47.     int i, sum=0;
  48.     jsize len = env->GetArrayLength(array);
  49.     jint *body=env->GetIntArrayElements(array, 0);
  50.     for(i=0; i<len; i++)
  51.     {
  52.         sum += body[i];
  53.     }
  54.     env->ReleaseIntArrayElements(array, body, 0);
  55.     return sum;
  56. }

  57. #endif
编译也可以使用bat文件编译为DLL库:
VCMakeUp.bat:

点击(此处)折叠或打开

  1. set VCBIN=D:\Microsoft Visual Studio\VC98\Bin
  2. set INCLUDE=D:\Microsoft Visual Studio\VC98\Include
  3. set LIB=D:\Microsoft Visual Studio\VC98\Lib
  4. set JAVA_HOME=D:\ProgramJava\Java\jdk1.6.0_30


  5. set PATH=%VCBIN%

  6. cl /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32 /c*.cpp
  7. cl /LD /I$%JAVA_HOME%\include /I%JAVA_HOME%\include\win32*.obj /FeSampleC.DLL
VC++6.0路径修改为你自己的 电脑路径.
编译出DLL运行既可。
运行指令:
>java Sample1
结果如下:

D:\NewLandWork_LANPENG\Lan_POS_LIB\Java-C>java Sample1
intMethod: 25
booleanMethod:false
stringMethod:JAVA
intArrayMethod:49

0 0