【编者按】:网学网C/C++为您提供jni试用资料参考,解决您在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对象: