日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

转 java c++互传arraylist

發(fā)布時(shí)間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转 java c++互传arraylist 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java JNI由淺入深(包括:Java和C++互傳ArrayList泛型對(duì)象參數(shù))

?1694人閱讀?評(píng)論(1)?收藏?舉報(bào)

?

?? ? ? ? 我們知道Java是一個(gè)運(yùn)行在虛擬機(jī)里面的高級(jí)的編程語(yǔ)言,如果要調(diào)用系統(tǒng)的動(dòng)態(tài)鏈接庫(kù)的話,就要先聲明native修飾的方法(類(lèi)似接口里面的方法),再由C/C++程序來(lái)實(shí)現(xiàn)(類(lèi)似實(shí)現(xiàn)接口里的方法)。這樣Java調(diào)用這些native方法就相當(dāng)于調(diào)用了C/C++里面實(shí)現(xiàn)了的方法。通常我們把這種機(jī)制叫做JNI(Java NativeInterfac),即Java?本地編程接口


? ?? ?? ? Android也同理,要學(xué)會(huì)在Android上進(jìn)行NDK開(kāi)發(fā),首先我們到打好java JNI的基礎(chǔ)。現(xiàn)在我們暫時(shí)把Android開(kāi)發(fā)丟到一邊先,試試在Java之下編譯一個(gè)C動(dòng)態(tài)鏈接庫(kù),再用Java程序調(diào)用。

?

1)先來(lái)個(gè)最簡(jiǎn)單的打印HelloWorld例子:

Java代碼(HelloJni.java):

?

[java]?view plaincopy
  1. import?java.util.*;??
  2. public?class?HelloJni{??
  3. ??????
  4. ????static{??
  5. ????????System.loadLibrary("hello");??
  6. ????}??
  7. ????public?native?static?void?sayHello();??
  8. ????public?static?void?main(String?[]?args)??
  9. ????{??
  10. ????????????????HelloJni.sayHello();??
  11. ????}??
  12. }??
?

?

生成頭文件(HelloJni.h):

先javac HelloJni.java編譯你的Java源碼,再javah–jni HelloJni生成所需的頭文件

頭文件內(nèi)容是這樣的:

?

[java]?view plaincopy
  1. /*?DO?NOT?EDIT?THIS?FILE?-?it?is?machine?generated?*/??
  2. #include?<jni.h>??
  3. /*?Header?for?class?HelloJni?*/??
  4. #ifndef?_Included_HelloJni??
  5. #define?_Included_HelloJni??
  6. #ifdef?__cplusplus??
  7. extern?"C"?{??
  8. #endif??
  9. JNIEXPORT?void?JNICALL?Java_HelloJni_sayHello?(JNIEnv?*,?jclass);??
  10. #ifdef?__cplusplus??
  11. }??
  12. #endif??
  13. #endif??
?

?


實(shí)現(xiàn)頭文件聲明的方法(HelloJni.cpp)


?

[c-sharp]?view plaincopy
  1. #include?"HelloJni.h"??
  2. JNIEXPORT?void?JNICALL?Java_HelloJni_sayHello(JNIEnv?*env,?jclass?cls)??
  3. {??
  4. ???????printf("HelloWorld");??
  5. }??
?

?

?

編譯命令:?g++ -I$JAVA_HOME/include-I$JAVA_HOME/include/linux HelloJni.cpp -shared -o libhello.so

命令參數(shù)解析:-I?是指引入java虛擬機(jī)的庫(kù)的路徑,-shared?是指編譯成動(dòng)態(tài)鏈接庫(kù)(共享庫(kù)) –o?輸出文件名(注意,在Linux平臺(tái)下的動(dòng)態(tài)鏈接庫(kù)有一個(gè)命名格式:“l(fā)ib+庫(kù)名+.so”在java代碼里面loadLibrary的時(shí)候不要加lib前綴和.so后綴)

由于我這里把這個(gè)動(dòng)態(tài)鏈接庫(kù)編譯放在當(dāng)前目錄下,所以還要設(shè)置環(huán)境變量LD_LIBRARY_PATH=該so動(dòng)態(tài)鏈接庫(kù)所在的目錄,才能正常運(yùn)行

?

?

#############################+++華麗的分割線+++###########################

?

2)好了,可以打印HelloWorld出來(lái)后,我們?cè)偕钊胍稽c(diǎn)點(diǎn),傳入一個(gè)int的數(shù),在C/C++代碼里面加1后返回。

?

Java代碼(HelloJni.java):

?

[java]?view plaincopy
  1. public?class?HelloJni{??
  2. ????????static{??
  3. ???????????????????System.loadLibrary("hello");??
  4. ????????}??
  5. ????????public?static?native?void?sayHello();??
  6. ????????public?native?int?getInt();??
  7. ????????public?native?void?setInt(int?i);??
  8. ????????public?static?void?main(String?args[]){??
  9. ????????//??????HelloJni.sayHello();??
  10. ?????????????????HelloJni?hello?=?new?HelloJni();??
  11. ?????????????????hello.setInt(2);??
  12. ?????????????????System.out.println(hello.getInt());??
  13. ????????}??
  14. }??
?

?

生成頭文件(HelloJni.h):

?

[c-sharp]?view plaincopy
  1. /*?DO?NOT?EDIT?THIS?FILE?-?it?is?machine?generated?*/??
  2. #include?<jni.h>??
  3. /*?Header?for?class?HelloJni?*/??
  4. #ifndef?_Included_HelloJni??
  5. #define?_Included_HelloJni??
  6. #ifdef?__cplusplus??
  7. extern?"C"?{??
  8. #endif??
  9. JNIEXPORT?void?JNICALL?Java_HelloJni_sayHello?(JNIEnv?*,?jclass);??
  10. JNIEXPORT?jint?JNICALL?Java_HelloJni_getInt?(JNIEnv?*,?jobject);??
  11. JNIEXPORT?void?JNICALL?Java_HelloJni_setInt?(JNIEnv?*,?jobject,?jint);??
  12. #ifdef?__cplusplus??
  13. }??
  14. #endif??
  15. #endif??
?

?

實(shí)現(xiàn)頭文件聲明的方法(HelloJni.cpp)

?

[java]?view plaincopy
  1. #include?"HelloJni.h"??
  2. int?i=1;??
  3. JNIEXPORT?void?JNICALL?Java_HelloJni_sayHello??
  4. ??(JNIEnv?*env,?jclass?cls){??
  5. ????????printf("HelloWorld/n");??
  6. }??
  7. JNIEXPORT?jint?JNICALL?Java_HelloJni_getInt??
  8. ??(JNIEnv?*env,?jobject?thiz){??
  9. ????????return?i;??
  10. }??
  11. JNIEXPORT?void?JNICALL?Java_HelloJni_setInt??
  12. ??(JNIEnv?*env,?jobject?thiz,jint?ji){??
  13. ????????i?=?ji+1;??
  14. }??
?

?

運(yùn)行結(jié)果:打印2


3)只是傳入簡(jiǎn)單的數(shù)據(jù)類(lèi)型不爽,這次讓C/C++生成個(gè)Java對(duì)象返回

?

Java代碼:pojo實(shí)體類(lèi)(User.java)

?

[c-sharp]?view plaincopy
  1. public?class?User{??
  2. ????????private?long?id;??
  3. ????????private?String?userName;??
  4. ????????private?boolean?isMan;??
  5. ????????private?int?age;??
  6. ????????public?User(){}??
  7. ????????public?User(long?id,?String?userName,?boolean?isMan,?int?age)?{??
  8. ????????????????super();??
  9. ????????????????this.id?=?id;??
  10. ????????????????this.userName?=?userName;??
  11. ????????????????this.isMan?=?isMan;??
  12. ????????????????this.age?=?age;??
  13. ????????}??
  14. ????????public?long?getId()?{??
  15. ????????????????return?id;??
  16. ????????}??
  17. ????????public?void?setId(long?id)?{??
  18. ????????????????this.id?=?id;??
  19. ????????}??
  20. ????????public?String?getUserName()?{??
  21. ????????????????return?userName;??
  22. ????????}??
  23. ????????public?void?setUserName(String?userName)?{??
  24. ????????????????this.userName?=?userName;??
  25. ????????}??
  26. ????????public?boolean?isMan()?{??
  27. ????????????????return?isMan;??
  28. ????????}??
  29. ????????public?void?setMan(boolean?isMan)?{??
  30. ????????????????this.isMan?=?isMan;??
  31. ????????}??
  32. ????????public?int?getAge()?{??
  33. ????????????????return?age;??
  34. ????????}??
  35. ????????public?void?setAge(int?age)?{??
  36. ????????????????this.age?=?age;??
  37. ????????}??
  38. }??
?

?

Java代碼(HelloJni.java):

?

[java]?view plaincopy
  1. public?class?HelloJni{??
  2. ????????static{??
  3. ????????????????System.loadLibrary("userbean");??
  4. ????????}??
  5. ????????public?static?native?void?sayHello();??
  6. ????????public?native?int?getInt();??
  7. ????????public?native?void?setInt(int?i);??
  8. ????????public?native?void?setUser(String?userName);??
  9. ????????public?native?User?getUser();??
  10. ????????public?static?void?main(String?args[]){??
  11. ????????//??????HelloJni.sayHello();??
  12. ????????????????HelloJni?hello?=?new?HelloJni();??
  13. ????????//??????hello.setInt(2);??
  14. ????????//??????System.out.println(hello.getInt());??
  15. ????????????????hello.setUser("LiangYaotian");??
  16. ????????????????User?user?=?hello.getUser();??
  17. ????????????????System.out.println("user?from?c/c++");??
  18. ????????????????System.out.println("name:"+user.getUserName());??
  19. ????????????????System.out.println("isMan?:"+user.isMan());??
  20. ????????????????System.out.println("age:"+user.getAge());??
  21. ????????}??
  22. }??
?

?

生成頭文件(HelloJni.h):

?

[c-sharp]?view plaincopy
  1. #include?<jni.h>??
  2. /*?Header?for?class?HelloJni?*/??
  3. #ifndef?_Included_HelloJni??
  4. #define?_Included_HelloJni??
  5. #ifdef?__cplusplus??
  6. extern?"C"?{??
  7. #endif??
  8. JNIEXPORT?void?JNICALL?Java_HelloJni_sayHello?(JNIEnv?*,?jclass);??
  9. JNIEXPORT?jint?JNICALL?Java_HelloJni_getInt?(JNIEnv?*,?jobject);??
  10. JNIEXPORT?void?JNICALL?Java_HelloJni_setInt?(JNIEnv?*,?jobject,?jint);??
  11. JNIEXPORT?void?JNICALL?Java_HelloJni_setUser?(JNIEnv?*,?jobject,?jstring);??
  12. JNIEXPORT?jobject?JNICALL?Java_HelloJni_getUser??(JNIEnv?*,?jobject);??
  13. #ifdef?__cplusplus??
  14. }??
  15. #endif??
  16. #endif??
?

?

實(shí)現(xiàn)頭文件聲明的方法(HelloJni.cpp)

?

[c-sharp]?view plaincopy
  1. #include?<iostream>??
  2. #include?<stdio.h>??
  3. using?namespace?std;??
  4. int?i=1;??
  5. jobject?user;??
  6. JNIEXPORT?void?JNICALL?Java_HelloJni_sayHello??
  7. ??(JNIEnv?*env,?jclass?cls){??
  8. ????????printf("HelloWorld/n");??
  9. }??
  10. JNIEXPORT?jint?JNICALL?Java_HelloJni_getInt??
  11. ??(JNIEnv?*env,?jobject?thiz){??
  12. ????????return?i;??
  13. }??
  14. JNIEXPORT?void?JNICALL?Java_HelloJni_setInt??
  15. ??(JNIEnv?*env,?jobject?thiz,jint?ji){??
  16. ????????i?=?ji+1;??
  17. }??
  18. JNIEXPORT?void?JNICALL?Java_HelloJni_setUser??
  19. ??(JNIEnv?*env,?jobject?thiz,?jstring?name){??
  20. ????????jclass?userClass?=?env->FindClass("User");??
  21. ????????jmethodID?userMethod?=?env->GetMethodID(userClass,"<init>","()V");??
  22. ????????jfieldID?mId?=?env->GetFieldID(userClass,"id","J");??
  23. ????????jfieldID?mUserName?=?env->GetFieldID(userClass,"userName","Ljava/lang/String;");??
  24. ????????jfieldID?mIsMan?=?env->GetFieldID(userClass,"isMan","Z");??
  25. ????????jfieldID?mAge?=?env->GetFieldID(userClass,"age","I");??
  26. ????????jobject?userObject?=?env->NewObject(userClass,userMethod);??
  27. ????????env->SetObjectField(userObject,mUserName,name);??
  28. ????????env->SetLongField(userObject,mId,1001);??
  29. ????????env->SetBooleanField(userObject,mIsMan,1);??
  30. ????????env->SetIntField(userObject,mAge,21);??
  31. ????????user?=?userObject;??
  32. }??
?

?

?

?

4)有些同學(xué)可能會(huì)說(shuō):“返回個(gè)Java對(duì)象算什么啊,C/C++和Java之間互傳復(fù)雜對(duì)象才好玩呢!”正所謂“不怕做不到,就怕想不到”,我們接著重構(gòu)一下上面那個(gè)例子!


這次我們傳包含有User對(duì)象的List到C/C++程序里面


Java代碼(User.java)

同上。

Java代碼(HelloJni.java)

?

[java]?view plaincopy
  1. import?java.util.*;??
  2. public?class?HelloJni{??
  3. ????????static{??
  4. ????????????????System.loadLibrary("userbean");??
  5. ????????}??
  6. ????????public?native?int?get();??
  7. ????????public?native?void?set(int?i);??
  8. ????????public?native?void?setUser(String?userName);??
  9. ????????public?native?User?getUser();??
  10. ????????public?native?void?setUserList(ArrayList<User>?userList);??
  11. ????????public?native?ArrayList<User>?getUserList();??
  12. ????????public?static?void?main(String?[]?args)??
  13. ????????{??
  14. ????????????????HelloJni?hello?=?new?HelloJni();??
  15. ????????//??????hello.set(2);??
  16. ????????//??????System.out.println(hello.get());??
  17. ????????/*?
  18. ????????????????hello.setUser("LiangYaotian");?
  19. ????????????????User?user?=?hello.getUser();?
  20. ????????????????System.out.println("user?from?c/c++");?
  21. ????????????????System.out.println("name:"+user.getUserName());?
  22. ????????????????System.out.println("isMan?:"+user.isMan());?
  23. ????????????????System.out.println("age:"+user.getAge());?
  24. ????????*/??
  25. ????????????????ArrayList<User>?userList?=?new?ArrayList<User>();??
  26. ????????????????for(int?i=0;i<10;i++){??
  27. ????????????????????????User?u?=?new?User((long)(1000+i),"LiangYaotian"+i,true,21);??
  28. ????????????????????????userList.add(u);??
  29. ????????????????}??
  30. ????????????????hello.setUserList(userList);??
  31. ????????????????userList?=?null;??
  32. ????????????????userList?=?hello.getUserList();??
  33. ????????????????System.out.println("ArrayList<User>?construct?from?C++,then?Java?print?it.....");??
  34. ????????????????for(User?u?:?userList){??
  35. ????????????????????????System.out.println("id:"+u.getId()+";?name:"+u.getUserName());??
  36. ????????????????}??
  37. ????????}??
  38. }??
?

?

C頭文件(HelloJni.h)

?

[java]?view plaincopy
  1. #include?<jni.h>??
  2. /*?Header?for?class?HelloJni?*/??
  3. #ifndef?_Included_HelloJni??
  4. #define?_Included_HelloJni??
  5. #ifdef?__cplusplus??
  6. extern?"C"?{??
  7. #endif??
  8. JNIEXPORT?void?JNICALL?Java_HelloJni_sayHello?(JNIEnv?*,?jclass);??
  9. JNIEXPORT?jint?JNICALL?Java_HelloJni_getInt?(JNIEnv?*,?jobject);??
  10. JNIEXPORT?void?JNICALL?Java_HelloJni_setInt?(JNIEnv?*,?jobject,?jint);??
  11. JNIEXPORT?void?JNICALL?Java_HelloJni_setUser?(JNIEnv?*,?jobject,?jstring);??
  12. JNIEXPORT?jobject?JNICALL?Java_HelloJni_getUser??(JNIEnv?*,?jobject);??
?

?

頭文件的實(shí)現(xiàn)(HelloJni.cpp)

?

[java]?view plaincopy
  1. #include?"HelloJni.h"??
  2. int?i=1;??
  3. jobject?user;??
  4. JNIEXPORT?jint?JNICALL?Java_HelloJni_get??
  5. ??(JNIEnv?*env,?jobject?jthiz){??
  6. ????????printf("HelloWorld/n");??
  7. }??
  8. JNIEXPORT?void?JNICALL?Java_HelloJni_set??
  9. ??(JNIEnv?*env,?jobject?jthiz,?jint?ji){??
  10. ????????i?=?ji+1;??
  11. }??
  12. JNIEXPORT?void?JNICALL?Java_HelloJni_setUser??
  13. ??(JNIEnv?*env,?jobject?jthiz,?jstring?name){??
  14. ????????jclass?userClass?=?env->FindClass("User");??
  15. ????????jmethodID?userMethod?=?env->GetMethodID(userClass,"<init>","()V");??
  16. ????????jfieldID?mId?=?env->GetFieldID(userClass,"id","J");??
  17. ????????jfieldID?mUserName?=?env->GetFieldID(userClass,"userName","Ljava/lang/String;");??
  18. ????????jfieldID?mIsMan?=?env->GetFieldID(userClass,"isMan","Z");??
  19. ????????jfieldID?mAge?=?env->GetFieldID(userClass,"age","I");??
  20. ????????jobject?userObject?=?env->NewObject(userClass,userMethod);??
  21. ????????env->SetObjectField(userObject,mUserName,name);??
  22. ????????env->SetLongField(userObject,mId,1001);??
  23. ????????env->SetBooleanField(userObject,mIsMan,1);??
  24. ????????env->SetIntField(userObject,mAge,21);??
  25. ????????user?=?userObject;??
  26. }??
  27. JNIEXPORT?jobject?JNICALL?Java_HelloJni_getUser??
  28. ??(JNIEnv?*env,?jobject?jthiz){??
  29. ????????return?user;??
  30. }??
  31. JNIEXPORT?void?JNICALL?Java_HelloJni_setUserList??
  32. ??(JNIEnv?*env,?jobject?jthiz,?jobject?userList){??
  33. ????????int?i;??
  34. ????????//class?ArrayList??
  35. ????????jclass?cls_arraylist?=?env->GetObjectClass(userList);??
  36. ????????//method?in?class?ArrayList??
  37. ????????jmethodID?arraylist_get?=?env->GetMethodID(cls_arraylist,"get","(I)Ljava/lang/Object;");??
  38. ????????jmethodID?arraylist_size?=?env->GetMethodID(cls_arraylist,"size","()I");??
  39. ????????jint?len?=?env->CallIntMethod(userList,arraylist_size);??
  40. ????????printf("get?java?ArrayList<User>?object?by?C++?,?then?print?it...../n");??
  41. ????????for(i=0;i<len;i++){??
  42. ????????????????jobject?obj_user?=?env->CallObjectMethod(userList,arraylist_get,i);??
  43. ????????????????jclass?cls_user?=?env->GetObjectClass(obj_user);??
  44. ????????????????jmethodID?user_getId?=?env->GetMethodID(cls_user,"getId","()J");??
  45. ????????????????jmethodID?user_getUserName?=?env->GetMethodID(cls_user,"getUserName","()Ljava/lang/String;");??
  46. ????????????????jmethodID?user_isMan?=?env->GetMethodID(cls_user,"isMan","()Z");??
  47. ????????????????jmethodID?user_getAge?=?env->GetMethodID(cls_user,"getAge","()I");??
  48. ????????????????jstring?name?=?(jstring)env->CallObjectMethod(obj_user,user_getUserName);??
  49. ????????????????jboolean?b?=?true;??
  50. ????????????????const?char?*namePtr?=?env->GetStringUTFChars(name,&b);??
  51. ????????????????jlong?id?=?env->CallLongMethod(obj_user,user_getId);??
  52. ????????????????jboolean?sex?=?env->CallBooleanMethod(obj_user,user_isMan);??
  53. ????????????????jint?age?=?env->CallIntMethod(obj_user,user_getAge);??
  54. ????????????????printf("Id:%d;?",id);??
  55. ????????????????printf("Name:%s;?",namePtr);??
  56. ????????????????printf("isMan??%d;?",sex);??
  57. ????????????????printf("Age:%d?/n?",age);??
  58. ????????}??
  59. }??
  60. JNIEXPORT?jobject?JNICALL?Java_HelloJni_getUserList??
  61. ??(JNIEnv?*env,?jobject?jthiz){??
  62. ????????//ArrayList?Object??
  63. ????????jclass?cls_ArrayList?=?env->FindClass("java/util/ArrayList");??
  64. ????????jmethodID?construct?=?env->GetMethodID(cls_ArrayList,"<init>","()V");??
  65. ????????jobject?obj_ArrayList?=?env->NewObject(cls_ArrayList,construct,"");??
  66. ????????jmethodID?arrayList_add?=?env->GetMethodID(cls_ArrayList,"add","(Ljava/lang/Object;)Z");??
  67. ????????//User?Object??
  68. ????????jclass?cls_user?=?env->FindClass("User");??
  69. ????????//none?argument?construct?function??
  70. ????????jmethodID?construct_user?=?env->GetMethodID(cls_user,"<init>","()V");??
  71. ????????//new?a?object??
  72. ????????jobject?obj_user?=?env->NewObject(cls_user,construct_user,"");??
  73. ????????//get?method?id??
  74. ????????/*?
  75. ????????jmethodID?user_setId?=?env->GetMethodID(cls_user,"setId","(J)V");?
  76. ????????jmethodID?user_setUserName?=?env->GetMethodID(cls_user,"setUserName","(Ljava/lang/String;)V");?
  77. ????????jmethodID?user_setMan?=?env->GetMethodID(cls_user,"setMan","(Z)V");?
  78. ????????jmethodID?user_setAge?=?env->GetMethodID(cls_user,"setAge","(I)V");?
  79. ????????*/??
  80. ????????int?i;??
  81. ????????for(i=0;i<10;i++){??
  82. ????????//new?a?object??
  83. ????????jobject?obj_user?=?env->NewObject(cls_user,construct_user,"");??
  84. ????????//get?field?id??
  85. ????????jfieldID?user_id?=?env->GetFieldID(cls_user,"id","J");??
  86. ????????jfieldID?user_name?=?env->GetFieldID(cls_user,"userName","Ljava/lang/String;");??
  87. ????????jfieldID?user_isMan?=?env->GetFieldID(cls_user,"isMan","Z");??
  88. ????????jfieldID?user_age?=?env->GetFieldID(cls_user,"age","I");??
  89. ????????env->SetLongField(obj_user,user_id,i);??
  90. ????????env->SetObjectField(obj_user,user_name,env->NewStringUTF("LiangYaoTian"));??
  91. ????????env->SetBooleanField(obj_user,user_isMan,1);??
  92. ????????env->SetIntField(obj_user,user_age,21);??
  93. ????????????????env->CallObjectMethod(obj_ArrayList,arrayList_add,obj_user);??
  94. ????????}??
  95. ????????return?obj_ArrayList;??
  96. }??
?

?

運(yùn)行結(jié)果:

轉(zhuǎn)載于:https://www.cnblogs.com/qinjunni/archive/2012/02/20/2359181.html

總結(jié)

以上是生活随笔為你收集整理的转 java c++互传arraylist的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。