jni试用资料 |
|
编译HelloWorld类 1 public class HelloWorld { 2 public native void displayHelloWorld(); 3 4 public native void printxx(String str); 5 6 static { 7 System.loadLibrary("hello"); 8 // System.load("hello"); 9 } 10 11 public static void main(String[] args) { 12 HelloWorld hw = new HelloWorld(); 13 hw.displayHelloWorld(); 14 for (int i = 0;; ++i) { 15 hw 16 .printxx("wo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kao"); 17 if (i % 1000 == 0) { 18 try { 19 Thread.sleep(10); 20 } catch (InterruptedException e) { 21 } 22 } 23 } 24 } 25 } 对编译完的class执行 javah HelloWorld 1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 /* Header for class HelloWorld */ 4 5 #ifndef _Included_HelloWorld 6 #define _Included_HelloWorld 7 #ifdef __cplusplus 8 extern "C" { 9 #endif
10 /* 11 * Class: HelloWorld 12 * Method: displayHelloWorld 13 * Signature: ()V 14 */ 15 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld 16 (JNIEnv *, jobject); 17 18 /* 19 * Class: HelloWorld 20 * Method: printxx 21 * Signature: (Ljava/lang/String;)V 22 */ 23 JNIEXPORT void JNICALL Java_HelloWorld_printxx 24 (JNIEnv *, jobject, jstring); 25 26 #ifdef __cplusplus 27 } 28 #endif 29 #endif 30 编译 cl -I%java_home%include -I%java_home%includewin32 -LDHelloWorld.c -Fehello.dll 1 #include <jni.h> 2 #include "HelloWorld.h" 3 #include <stdio.h> 4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 5 { 6 printf("Hello world! "); 7 return; 8 } 9 10 JNIEXPORT void JNICALL Java_HelloWorld_printxx 11 (JNIEnv *env, jobject obj, jstring prompt){ 12 13 const char *str = (*env)->GetStringUTFChars(env, prompt, 0); 14 printf("%s",prompt);
15 (*env)->ReleaseStringUTFChars(env, prompt, str); 16 17 return; 18 } 19 20 3.Java类型和当地类型对应 在如下状况下,需求在当地 步骤中 利用java对象的 引用,就会用到类型中间的转换: 1)java 步骤里面将参数传入当地 步骤; 2)在当地 步骤里面 缔造java对象; 3)在当地 步骤里面return 后果给java程序 。 分为如下两种状况: Java原始类型 像booleans、integers、floats等从Java程序中传到当地 步骤中的原始类型 可以直接 使用,下面是java中的原始类型和当地 步骤中的类型的对应: Java类型 当地类型 字节(bit) boolean jboolean 8, unsigned byte jbyte 8 char jchar 16, unsigned short jshort 16 int jint 32 long jlong 64 float jfloat 32 double jdouble 64 void void n/a 也便是说假如我在 步骤中传进去了一个boolean的参数的话,那么我在当地 步骤中就有jboolean类型与之对应 。同理,假如在当地 步骤中return一个jint的话,那么在java中就返回一个int类型 。 中国网管论坛 Java对象 Java对象做为 引用被传递到当地 步骤中,全部这些Java对象的 引用都有一个一起的父类型jobject(相当于java中的Object类是全部类的父类一样) 。下面是JNI实现的一些jobject的子类: 4.当地 步骤中 拜访java程序中的内容 1) 拜访String对象:
|