标签:style class blog code java http
由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的部分。
源代码链接:http://files.cnblogs.com/GDUT/jni-demo.rar
1. 普通Java类(包含测试方法):MyJNI.java
1 public class MyJNI { 2 3 //加载动态链接库 4 static { 5 System.out.println("开始加载动态链接库"); 6 System.loadLibrary("MyJNI"); 7 System.out.println("动态链接库加载完毕。"); 8 } 9 10 public native void go(); 11 12 public native void run(); 13 14 public native String getName(); 15 16 public native int[] sort(int[] array); 17 18 //测试 19 public static void main(String[] args) { 20 MyJNI jni = new MyJNI(); 21 int[] array = {5, 3, 6, 35, 74, 8}, sortedArray; 22 23 jni.run(); 24 jni.go(); 25 jni.getName(); 26 sortedArray = jni.sort(array); 27 //由于这是本地方法调用,这里的数组和平常的数组的引用不太一样。 28 29 for(int i=0; i<sortedArray.length; i++){ 30 System.out.print(sortedArray[i] + "\t"); 31 } 32 33 } 34 }
2. 由Java类编译后生成的C++头文件:MyJNI.h
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 /* Header for class MyJNI */ 4 5 #ifndef _Included_MyJNI 6 #define _Included_MyJNI 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 /* 11 * Class: MyJNI 12 * Method: go 13 * Signature: ()V 14 */ 15 JNIEXPORT void JNICALL Java_MyJNI_go 16 (JNIEnv *, jobject); 17 18 /* 19 * Class: MyJNI 20 * Method: run 21 * Signature: ()V 22 */ 23 JNIEXPORT void JNICALL Java_MyJNI_run 24 (JNIEnv *, jobject); 25 26 /* 27 * Class: MyJNI 28 * Method: getName 29 * Signature: ()Ljava/lang/String; 30 */ 31 JNIEXPORT jstring JNICALL Java_MyJNI_getName 32 (JNIEnv *, jobject); 33 34 /* 35 * Class: MyJNI 36 * Method: sort 37 * Signature: ([I)[I 38 */ 39 JNIEXPORT jintArray JNICALL Java_MyJNI_sort 40 (JNIEnv *, jobject, jintArray); 41 42 #ifdef __cplusplus 43 } 44 #endif 45 #endif
3. 需要调用的C++函数的相关文件:MyJNIImpl.cpp
1 #include <jni.h> 2 #include "MyJNI.h" 3 #include <stdio.h> 4 5 6 /* 7 * Class: MyJNI 8 * Method: go 9 * Signature: ()V 10 */ 11 JNIEXPORT void JNICALL Java_MyJNI_go 12 (JNIEnv * env, jobject jobj){ 13 14 printf("I am going....\n"); 15 } 16 17 /* 18 * Class: MyJNI 19 * Method: run 20 * Signature: ()V 21 */ 22 JNIEXPORT void JNICALL Java_MyJNI_run 23 (JNIEnv * env, jobject jobj){ 24 25 printf("I am running....\n"); 26 } 27 28 /* 29 * Class: MyJNI 30 * Method: getName 31 * Signature: ()Ljava/lang/String; 32 */ 33 JNIEXPORT jstring JNICALL Java_MyJNI_getName 34 (JNIEnv * env, jobject job){ 35 36 printf("I am GDUTtiantian, go with me.\n"); 37 //将字符串转化为jstring类型 38 //jstring就是对应java的String类型 39 jstring p = env->NewStringUTF("GDUTtiantian"); 40 return p; 41 } 42 43 /* 44 * Class: MyJNI 45 * Method: sort 46 * Signature: ([I)[I 47 */ 48 JNIEXPORT jintArray JNICALL Java_MyJNI_sort 49 (JNIEnv * env, jobject jobj, jintArray array){ 50 51 jint* arr;//定义一个整形指针 52 int sum=0; 53 //对于整形数组的处理,主要有GetIntArrayElements与GetIntArrayRegion 54 //第一种方法 55 arr = env->GetIntArrayElements(array, NULL);//得到一个指向原始数据类型内容的指针 56 jint length = env->GetArrayLength(array);//得到数组的长度 57 58 for(int i=0; i<length; i++){ 59 for(int j=i+1; j<length; j++){ 60 if(arr[i] > arr[j]){ 61 jint temp = arr[i]; 62 arr[i] = arr[j]; 63 arr[j] = temp; 64 } 65 } 66 } 67 68 69 for(int i=0; i<length; i++){ 70 printf("%d ", arr[i]); 71 } 72 73 printf("\n排序完成\n"); 74 75 jintArray javaArray = env->NewIntArray(length); 76 env->SetIntArrayRegion(javaArray, 0, length, arr); 77 78 return javaArray;//返回排序后的数组 79 }
编译之后,生成一个动态链接库文件:MyJNI.dll
在Java类中就是通过加载这个库文件,调用其中的相关函数。
调用的相关命令:
参考资料:http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
JNI类型转换:http://www.cnblogs.com/lgydqy/archive/2012/02/28/2371592.html
函数
Java 数组类型
本地类型
GetBooleanArrayElements
jbooleanArray
jboolean
GetByteArrayElements
jbyteArray
jbyte
GetCharArrayElements
jcharArray
jchar
GetShortArrayElements
jshortArray
jshort
GetIntArrayElements
jintArray
jint
GetLongArrayElements
jlongArray
jlong
GetFloatArrayElements
jfloatArray
jfloat
GetDoubleArrayElements
jdoubleArray
jdouble
欢迎讨论交流, 我的主页:http://www.cnblogs.com/GDUT/
我的邮箱:zone.technology.exchange@gmail.com
标签:style class blog code java http
原文地址:http://www.cnblogs.com/GDUT/p/3806771.html