国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java調用C/C++編寫的第三方dll動態鏈接庫

開發 后端
這里主要用的方法是JNI。在網上查資料時看到很多人說用JNI非常的復雜,不僅要看很多的文檔,而且要非常熟悉C/C++編程。恐怕有很多人在看到諸如此類的評論時已經決定繞道用其他方法了。本文將做詳細的介紹。

最近在用weka做一個數據挖掘相關的項目,不得不說,weka還是一個不錯的開放源代碼庫,提供了很多最常用的分類和聚類算法。

在我的項目中要用到一個聚類算法,Affinity Propagation(AP),由多倫多大學的Brendan J. Frey發表于2007年。相比其他的聚類算法,AP算法的聚類結果更加準確。

在AP的官方網站公布了AP算法的動態鏈接庫,我的目標就是實現在Java工程中調用這個動態鏈接庫。

在網上查了資料,發現,如果僅僅是想調用Windows的Native API還是比較省事的,這里我主要針對第三方dll的調用。

下面進入正題。

這里主要用的方法是JNI。在網上查資料時看到很多人說用JNI非常的復雜,不僅要看很多的文檔,而且要非常熟悉C/C++編程。恐怕有很多人在看到諸如此類的評論時已經決定繞道用其他方法了。但是,假如你要實現的功能并不復雜(簡單的參數傳遞,獲取返回值等等),我還是支持使用這個方法的。

Java Native Interface,簡稱JNI,是Java平臺的一部分,可用于讓Java和其他語言編寫的代碼進行交互。下面是從網上摘取的JNI工作示意圖。


圖1 JNI的工作模式

下面就舉具體的例子說明一下使用步驟:

1) 編寫一個類,聲明native方法

  1. public class APCluster {   
  2.     public native int[] CallAPClusterDll( int         arg_Int,   
  3.                                           double[]    arg_DoubleArray,   
  4.                                           boolean     arg_boolean);  
  5.     static 
  6.     {  
  7.         System.loadLibrary("APClusterDllMedium");  
  8.     }  

上面是APCluster.java文件,定義了一個APCluster類,其中有一個方法CallAPClusterDll(),需要傳遞三種不同類型的參數,并且返回一個整型數組。

注意,這里只需要聲明這個方法,并不需要實現,具體實現就在APClusterDllMedium中。

APClusterDllMedium就像中介一樣,Java通過調用這個中介Dll中的CallAPClusterDll方法,間接調用真正的第三方Dll。

2)編譯生成.h文件

第一步:

javac APCluster.java 生成APCluster.class

第二步:

javah APCluster 生成APCluster.h頭文件,內容如下:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */ 
  2. #include <jni.h>  
  3. /* Header for class APCluster */ 
  4. #ifndef _Included_APCluster  
  5. #define _Included_APCluster  
  6. #ifdef __cplusplus  
  7. extern "C" {  
  8. #endif10 /*  
  9.  * Class:     APCluster  
  10.  * Method:    CallAPClusterDll  
  11.  * Signature: (I[DZ)[I  
  12.  */ 
  13. JNIEXPORT jintArray JNICALL Java_APCluster_CallAPClusterDll  
  14.   (JNIEnv *, jobject, jint, jdoubleArray, jboolean);  
  15. #ifdef __cplusplus  
  16. }  
  17. #endif21
  18. #endif 

注意,APCluster.h這個頭文件的內容是不能修改的,否則JNI會找不到相對應的CallAPClusterDll()的實現。

3)創建C/C++工程,實現CallAPClusterDll()方法。

創建一個C/C++工程,工程名為APClusterDllMedium(其實,生成的dll名為APClusterDllMedium即可),導入APCluster.h這個頭文件,并創建一個CPP文件,實現.h文件中的方法。

 
圖2 新建工程結構

由于我創建的工程是win32控制臺程序,所以最后默認生成的是.exe文件,所以還要做一步工程屬性修改,讓它生成.dll后綴文件。

打開Project Property ->General,做以下修改:

 
圖3 修改工程屬性

下面就是實現 JNIEXPORT jintArray JNICALL Java_APCluster_CallAPClusterDll (JNIEnv *, jobject, jint, jdoubleArray, jboolean); 這個方法了。先貼代碼再慢慢解釋吧。

  1. #include "APCluster.h"   
  2. #include <stdio.h>   
  3. #include <windows.h>  
  4. #ifdef __cplusplus   
  5. extern "C" {  
  6. #endif  
  7. typedef int*  (__stdcall *APCLUSTER32)(double*, unsigned int, bool);  
  8. JNIEXPORT jintArray JNICALL Java_APCluster_CallAPClusterDll  
  9.   (JNIEnv *env, jobject _obj, jint _arg_int, jdoubleArray _arg_doublearray, jboolean _arg_boolean)  
  10. {  
  11.     HMODULE dlh = NULL;  
  12.     APCLUSTER32 apcluster32;  
  13.     if (!(dlh=LoadLibrary("apclusterwin.dll")))        //第三方DLL位置  
  14.     {  
  15.         printf("LoadLibrary() failed: %d\n", GetLastError());   
  16.     }  
  17.     if (!(apcluster32 = (APCLUSTER32)GetProcAddress(dlh, "apcluster32")))    //具體調用apcluster32方法  
  18.     {  
  19.         printf("GetProcAddress() failed: %d\n", GetLastError());   
  20.     }  
  21.     int        m_int = _arg_int;  //類型轉換  
  22.     double*    m_doublearray = env->GetDoubleArrayElements(_arg_doublearray, NULL);  
  23.     bool       m_boolean = _arg_boolean;  
  24.     int* ret = (*apcluster32)(m_doublearray, m_int, m_boolean); /* actual function call */ 
  25.     jintArray result = env->NewIntArray(_arg_int);  
  26.     env->SetIntArrayRegion(result, 0, _arg_int, (const jint*)ret);  
  27.     FreeLibrary(dlh); /* unload DLL and free memory */ 
  28.     if(ret)   
  29.     {  
  30.          free(ret);   
  31.     }  
  32.     return result;  
  33. }  
  34. #ifdef __cplusplus  
  35. }  
  36. #endif 

a)首先為了#include <jni.h>,必須添加JNI所在的目錄。

打開Project Property -> C/C++ -> General -> Additional Include Directories添加相應目錄:

 
圖4 添加JNI目錄

b)在APCluster.h文件中自動生成的函數,只標識了函數參數類型,為了引用這些參數,自己起一個相應的名字:

JNIEXPORT jintArray JNICALL Java_APCluster_CallAPClusterDll
(JNIEnv *env, jobject _obj, jint _arg_int, jdoubleArray _arg_doublearray, jboolean _arg_boolean) ......

c)聲明函數指針,就是你要調用的第三方dll中函數的類型。

d)LoadLibrary,導入真正的第三方Dll,并找到要調用的方法的函數地址。

把這個函數地址賦值給函數指針,接下來就可以通過這個函數指針調用真正的apcluster函數了!

e)類型轉換:

讀讀jni.h文件就知道jdouble和double其實是一個東西,jboolean就是unsigned char類型,jni.h中是這么聲明的:

  1. typedef unsigned char    jboolean;  
  2. typedef unsigned short   jchar;  
  3. typedef short            jshort;  
  4. typedef float            jfloat;  
  5. typedef double           jdouble; 

但是數組類型就沒有這么簡單,獲取數組要使用類型相對應的env->GetTypeArrayElement(jTypeArray...)。

最后,要返回一個jint類型的數組,就要新創建一個此類型的數組,再為其賦值:

  1. jintArray result = env->NewIntArray(_arg_int);  
  2. env->SetIntArrayRegion(result, 0, _arg_int, (const jint*)ret); 

其中,_arg_int代表的是創建數組的長度。

最后return result。

4)Build這個工程。

Build,生成相應的APCluster.dll文件,將這個dll放到java工程目錄下。

 
圖5 將生成的dll放到java工程下

5)編寫測試java程序,調用dll庫。

以下為測試程序,Test.java:

  1. public class Test    
  2. {  
  3.     public static void main(String[] args)   
  4.     {   
  5.         double     arg_doublearray[] = {0.10.20.3};   
  6.         int        arg_int = 3;   
  7.         boolean    arg_boolean = true;   
  8.         int[]  result = new APCluster().CallAPClusterDll(arg_int, arg_doublearray, arg_boolean);  
  9.         .....  
  10.     }  

到此,java調用第三方dll就基本完成了。

本文也主要是介紹大概的操作流程,至于具體應該使用哪些API就只有去研究官方文檔了。

另外還有一些需要注意的問題,比如64位的程序去調用32位的dll會報錯啊等等...這些都是細節問題了。

最后,個人認為,自己動手實踐還是很重要,網上都說這個復雜那個難,但是至于難還是不難,還是要實踐了才知道...不能不去嘗試...

原文鏈接:http://www.cnblogs.com/AnnieKim/archive/2012/01/01/2309567.html

【編輯推薦】

  1. 深入理解JavaScript之強大的原型和原型鏈
  2. 制作完整的Java可執行文件
  3. Apache Camel 2.9.0發布 Java規則引擎
  4. JActor 1.0發布 Actor模式的Java實現
  5. 深入Java虛擬機之內存優化
責任編輯:林師授 來源: 金玉姬的博客
相關推薦

2024-03-01 20:59:11

C#DLL開發

2009-08-05 16:29:18

C#調用C++動態鏈接

2011-05-18 17:15:45

2012-01-04 14:02:26

JsonCpp

2010-02-01 17:37:35

C++調用C鏈接庫

2019-07-30 11:35:54

AndroidRetrofit

2015-11-05 16:44:37

第三方登陸android源碼

2013-04-07 15:13:21

CocoaPods第三方庫管理利器

2009-10-29 16:36:49

VB.NET .DLL

2009-08-28 16:19:30

C#實現修改動態鏈接庫

2014-07-22 10:56:45

Android Stu第三方類庫

2023-08-02 10:10:00

C#C++

2017-12-11 15:53:56

2020-10-29 09:56:23

Linux靜態庫動態庫

2014-07-23 08:55:42

iOSFMDB

2009-08-05 16:49:42

C#中調用dll

2021-10-11 06:38:52

Go開源庫語言

2022-06-06 07:50:55

PythonJSON

2013-01-15 13:50:22

iOS開發開源庫

2022-05-21 23:56:16

Python庫搜索Python
點贊
收藏

51CTO技術棧公眾號

中文日韩电影网站| 亚洲欧洲精品在线观看| 亚洲1234区| 一区二区三区四区蜜桃| 一区二区三区av| 亚洲黄页一区| 91青青草免费在线看| 欧美视频网址| 国产成人在线一区| 天天做夜夜做人人爱精品 | 一本久道久久综合中文字幕| 99re热视频在线| 国产欧美精品一区二区三区四区 | 综合视频在线| 国产欧美在线看| 国内精品伊人久久久| 4p变态网欧美系列| 成人av地址| 久久久久久久久亚洲| 99re热精品视频| 国内自拍欧美激情| 中文精品一区二区| 国产精品久久久亚洲| 99精品视频在线观看播放| 91麻豆国产精品| 亚洲大片av| 色噜噜色狠狠狠狠狠综合色一| 蜜桃精品视频在线| 一区二区免费在线视频| 国产在线播放一区| 日本午夜激情视频| 国产网红主播福利一区二区| 四虎4hutv紧急入口| 亚洲小说欧美激情另类| 欧美色综合一区二区三区| 欧美日韩精品三区| 国产91足控脚交在线观看| 亚洲人成伊人成综合网久久久| 丰满少妇一区| 国产精品高精视频免费| 欧美特黄视频| 亚洲一区影院| 国产亚洲精品aa午夜观看| 国内福利写真片视频在线| 欧美一级欧美三级| 国产日韩一区二区三免费高清| 国产精品黄色影片导航在线观看| 在线看片欧美| 国产女主播自拍| 亚洲麻豆国产自偷在线| 老司机福利在线视频| 在线观看久久久久久| 国产一区二区亚洲| 日韩精品国内| 国产人伦精品一区二区| 男人的天堂在线视频| 日韩高清a**址| 日韩美女国产精品| 欧美精品一区二区三区在线看午夜| 成人涩涩免费视频| 日本在线中文电影| 日韩欧美激情四射| 中文一区二区三区四区| 亚洲综合自拍一区| 丁香天五香天堂综合| 在线色视频观看| 亚洲欧美成人网| 精品久久精品| 国产在线无码精品| 亚洲国产精品久久久久婷婷884 | 日本精品国产| 春色成人在线视频| 国产成人在线观看| 日本高清好狼色视频| 亚洲精品久久久久久久久久久久久| 一区二区在线免费播放| 精品国产乱码一区二区三区四区| 久久免费国产精品| 怡红院av在线| 国产剧情日韩欧美| 2欧美一区二区三区在线观看视频| 成人综合影院| 久久久久久久国产| 免费观看久久久4p| 深夜福利在线观看直播| 欧美美女操人视频| 日韩精品一级中文字幕精品视频免费观看 | 欧美美女直播网站| 成人在线视频你懂的| 日本一区二区免费看| 亚洲欧美一区二区不卡| 91色在线看| 成人av免费在线看| 亚洲天堂免费在线观看视频| 朝桐光一区二区| 狠狠色综合色区| 亚洲精品精品亚洲| 日韩三区免费| 久久青青草原一区二区| 国产精品久久久久久久久快鸭| 96av在线| 亚洲一区中文字幕在线观看| 中文字幕制服丝袜成人av| 性欧美videohd高精| 免费日韩av电影| 色综合久久中文综合久久97| 欧美挤奶吃奶水xxxxx| www.日本三级| 欧美成人激情免费网| 欧美三级黄美女| 中文字幕在线资源 | 亚洲激情五月婷婷| 亚洲视频自拍| 国产女主播av| 亚洲精品aⅴ中文字幕乱码 | 国产成人av一区| a级网站在线播放| 91国产在线免费观看| 亚洲日本青草视频在线怡红院 | 成人av一级片| 亚洲欧美中文日韩v在线观看| 亚洲主播在线| 在线免费观看的av网站| 91在线观看免费观看| 一区二区国产视频| 美女网站色精品尤物极品姐弟| 欧美日韩福利在线| 国产亚洲欧洲高清| 国产成人免费视频| 欧美成人免费电影| 欧美xxxx吸乳| 亚洲欧洲在线看| 粉嫩一区二区三区在线看| 色老太综合网| 一二三四中文字幕| 在线成人激情黄色| 国产91丝袜在线播放九色| 另类激情视频| 樱空桃在线播放| 亚洲欧洲自拍偷拍| 国产成人av在线影院| 日韩在线影院| 真人抽搐一进一出视频| 久久精品视频免费播放| 国产精品视频在线看| 青青一区二区| 丝袜视频国产在线播放| 精品国产免费一区二区三区| 91精品免费观看| 国产在线视频一区二区三区| 小视频免费在线观看| heyzo亚洲| 日本精品视频在线| 色欧美片视频在线观看在线视频| 精品美女一区| 哺乳一区二区三区中文视频| 欧美va天堂在线| 成人高清av在线| 日韩午夜电影免费看| 亚洲中文字幕无码中文字| 久久手机免费视频| 国产精品超碰97尤物18| 欧美日韩激情| 米奇精品一区二区三区| 无码人妻精品一区二区蜜桃百度| 欧美另类高清videos| 亚洲国产va精品久久久不卡综合| 日韩av中文字幕第一页| 在线播放日韩欧美| 亚洲精品久久嫩草网站秘色| 亚洲精品国产日韩| 电影亚洲一区| 日本成在线观看| 免费成人看片网址| 久久精品国产69国产精品亚洲| 亚洲欧美激情视频在线观看一区二区三区 | 欧美夫妻性生活视频| 最新不卡av在线| 黄色av成人| 在线日韩影院| 嫩草影院网站在线| 无码免费一区二区三区免费播放| 色婷婷av一区二区三区久久| 亚洲一区在线观看免费观看电影高清| 亚洲高清成人| 国产精品3区| 精品无人乱码| 国产中文字幕二区| 亚洲一区二区三区777| 中文字幕在线看视频国产欧美在线看完整 | 成人免费三级在线| 国产日产一区| 麻豆免费在线| 欧美aaa一级| youjizz.com亚洲| 国产精品稀缺呦系列在线| 亚洲欧美在线看| 在线影视一区二区三区| 国产亚洲va综合人人澡精品| 日韩高清欧美激情|