精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java調(diào)用C/C++編寫的第三方dll動態(tài)鏈接庫

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

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

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

在AP的官方網(wǎng)站公布了AP算法的動態(tài)鏈接庫,我的目標就是實現(xiàn)在Java工程中調(diào)用這個動態(tài)鏈接庫。

在網(wǎng)上查了資料,發(fā)現(xiàn),如果僅僅是想調(diào)用Windows的Native API還是比較省事的,這里我主要針對第三方dll的調(diào)用。

下面進入正題。

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

Java Native Interface,簡稱JNI,是Java平臺的一部分,可用于讓Java和其他語言編寫的代碼進行交互。下面是從網(wǎng)上摘取的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(),需要傳遞三種不同類型的參數(shù),并且返回一個整型數(shù)組。

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

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

2)編譯生成.h文件

第一步:

javac APCluster.java 生成APCluster.class

第二步:

javah APCluster 生成APCluster.h頭文件,內(nèi)容如下:

  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這個頭文件的內(nèi)容是不能修改的,否則JNI會找不到相對應的CallAPClusterDll()的實現(xiàn)。

3)創(chuàng)建C/C++工程,實現(xiàn)CallAPClusterDll()方法。

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

 
圖2 新建工程結(jié)構(gòu)

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

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

 
圖3 修改工程屬性

下面就是實現(xiàn) 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")))    //具體調(diào)用apcluster32方法  
  18.     {  
  19.         printf("GetProcAddress() failed: %d\n", GetLastError());   
  20.     }  
  21.     int        m_int = _arg_int;  //類型轉(zhuǎn)換  
  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文件中自動生成的函數(shù),只標識了函數(shù)參數(shù)類型,為了引用這些參數(shù),自己起一個相應的名字:

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

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

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

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

e)類型轉(zhuǎn)換:

讀讀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; 

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

最后,要返回一個jint類型的數(shù)組,就要新創(chuàng)建一個此類型的數(shù)組,再為其賦值:

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

其中,_arg_int代表的是創(chuàng)建數(shù)組的長度。

最后return result。

4)Build這個工程。

Build,生成相應的APCluster.dll文件,將這個dll放到j(luò)ava工程目錄下。

 
圖5 將生成的dll放到j(luò)ava工程下

5)編寫測試java程序,調(diào)用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調(diào)用第三方dll就基本完成了。

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

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

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

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

【編輯推薦】

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

2024-03-01 20:59:11

C#DLL開發(fā)

2009-08-05 16:29:18

C#調(diào)用C++動態(tài)鏈接

2011-05-18 17:15:45

2012-01-04 14:02:26

JsonCpp

2010-02-01 17:37:35

C++調(diào)用C鏈接庫

2019-07-30 11:35:54

AndroidRetrofit

2015-11-05 16:44:37

第三方登陸android源碼

2009-10-29 16:36:49

VB.NET .DLL

2013-04-07 15:13:21

CocoaPods第三方庫管理利器

2009-08-28 16:19:30

C#實現(xiàn)修改動態(tài)鏈接庫

2014-07-22 10:56:45

Android Stu第三方類庫

2023-08-02 10:10:00

C#C++

2009-08-05 16:49:42

C#中調(diào)用dll

2020-10-29 09:56:23

Linux靜態(tài)庫動態(tài)庫

2017-12-11 15:53:56

2014-07-23 08:55:42

iOSFMDB

2021-10-11 06:38:52

Go開源庫語言

2022-06-06 07:50:55

PythonJSON

2022-05-21 23:56:16

Python庫搜索Python

2013-01-15 13:50:22

iOS開發(fā)開源庫
點贊
收藏

51CTO技術(shù)棧公眾號

国产激情视频在线观看| av手机天堂网| 视频福利一区| 在线视频综合导航| 欧美h视频在线观看| 免费观看成年人视频| 久久久久国内| 九九热精品视频在线播放| 中文字幕免费高清视频| 成人四虎影院| 亚洲综合色婷婷| 日韩av高清在线播放| 国产日产亚洲系列最新| 免费视频久久| 欧美大片在线看| 日本理论中文字幕| 国产suv精品一区二区四区视频| 日韩成人一级片| 粗暴蹂躏中文一区二区三区| 91精品人妻一区二区| www.久久草.com| 色视频一区二区| 亚洲一区二区精品在线| 五月婷婷丁香网| 国产中文字幕一区| 国产97在线观看| 国产网友自拍视频| 亚洲老妇激情| 中文字幕成人精品久久不卡| 欧美一区二区免费在线观看| www一区二区三区| 日本韩国欧美在线| 国产一区二区网| 色呦呦网站在线观看| 国产免费观看久久| 久久久久久久久四区三区| av中文字幕播放| 蜜桃久久久久久| 国产999精品久久久影片官网| 国产ts丝袜人妖系列视频| 精品久久国产一区| 欧美专区日韩专区| 成人毛片视频网站| 波多野结衣中文字幕久久| 日韩一区欧美一区| 亚洲欧美日产图| 国产精品影院在线| 久久综合色天天久久综合图片| 日本伊人精品一区二区三区介绍| 丰满少妇一区二区三区| 天堂精品在线视频| 日韩一区二区三区在线观看| 亚洲精品综合在线观看| 九七电影院97理论片久久tvb| 樱桃视频在线观看一区| 波多野结衣三级在线| wwwww在线观看免费视频| 久久香蕉国产线看观看99| 精品久久久久久综合日本| 国产成人无码www免费视频播放| 新67194成人永久网站| 97涩涩爰在线观看亚洲| 日产欧产va高清| 国产欧美丝祙| 日本国产欧美一区二区三区| 日韩色图在线观看| 美女精品一区| 国产精品久久久久久久7电影| 天天综合天天做| 亚洲国产精品久久久久蝴蝶传媒| 亚洲精品国精品久久99热 | 欧美高清视频在线| 人妻人人澡人人添人人爽| 国产精品毛片久久| 欧美国产亚洲视频| 日产电影一区二区三区| 六月丁香综合| 国产精品老牛影院在线观看| 97av免费视频| 成人永久看片免费视频天堂| 久久国产日韩欧美| 国产九色在线| 亚洲精品亚洲人成人网在线播放| 欧美深深色噜噜狠狠yyy| 国产1区2区3区在线| **性色生活片久久毛片| 免费一级淫片aaa片毛片a级| 中文字幕在线直播| 欧美三级蜜桃2在线观看| 国产精品中文久久久久久| 国产欧美三级电影| 国产一区二区三区精品久久久 | 成人av中文字幕| 国产精品夜夜夜一区二区三区尤| 国产伦理一区二区| 99精品久久免费看蜜臀剧情介绍| 147欧美人体大胆444| 特黄视频在线观看| 国产精品色呦呦| 国产精品久久久久9999爆乳| 成人看片在线观看| 精品国产伦一区二区三区免费| 91 视频免费观看| 欧美电影免费网站| 视频直播国产精品| 精品无码人妻一区二区三| 日韩电影在线一区二区三区| 3d动漫精品啪啪一区二区三区免费 | 国产精品久久久久久免费播放| 欧美综合二区| 91免费高清视频| 日本中文字幕一区二区有码在线| 亚洲一二三在线观看| 亚洲激情中文| 日本久久91av| www久久久com| 日本一区二区久久| 欧美一级片免费播放| 日韩成人综合网| 亚洲精品电影久久久| 肉色超薄丝袜脚交69xx图片 | 亚洲第一福利视频| 免费看的黄色录像| 久久婷婷av| 国产一区免费视频| 18视频在线观看网站| 色综合久久精品| 白嫩情侣偷拍呻吟刺激| 亚洲五月综合| 国产精品网站视频| 玖玖综合伊人| 欧美日韩亚洲视频一区| 国产麻豆剧传媒精品国产| 999精品在线| 国产日产欧美精品| jizz在线观看视频| 91国偷自产一区二区开放时间| 99视频在线视频| 久久av免费看| 欧美最猛性xxxxx亚洲精品| 亚洲av无码乱码国产精品久久| 成年人网站91| 免费cad大片在线观看| 亚洲精品69| 日韩视频精品在线| 中文字幕福利视频| 国产精品三级电影| 在线免费av播放| 欧美亚洲在线日韩| 国产精品久久久久久婷婷天堂| 国产普通话bbwbbwbbw| 国产精品久久影院| 中文字幕日韩综合| 国产精品成人一区二区不卡| 国产欧美精品在线播放| 日韩大片在线永久免费观看网站| 一卡二卡欧美日韩| 一级全黄裸体片| 亚洲国产一区二区精品专区| 国产偷国产偷亚洲高清97cao| 黄色视屏网站在线免费观看| 日本精品视频一区二区三区| 精品成人无码一区二区三区| 免费在线观看成人| 国产成年人在线观看| 成人豆花视频| 欧美国产一区二区三区| 色婷婷在线视频| 一区二区三区四区精品在线视频| 久久久久久久久久网| 精品综合久久88少妇激情| 欧美专区福利在线| 大胆av不用播放器在线播放| 欧美精品三级日韩久久| 久久免费视频6| 99re在线精品| 老头吃奶性行交视频| 99久久久国产精品美女| 91麻豆蜜桃| 天堂资源在线| 中文字幕亚洲一区二区三区| 99精品在线视频观看| 亚洲成在人线在线播放| 美女脱光内衣内裤| 久久国产精品无码网站| 99久久免费观看| 亚洲影院天堂中文av色| 成人激情春色网| 九九精品调教| 亚洲欧洲一区二区三区久久| 中文字幕 欧美激情| 亚洲综合一区二区精品导航| 一级片视频免费看| 国产精品羞羞答答xxdd| 欧美在线观看成人| 久久久久久久久丰满| 国产综合动作在线观看| 91九色综合| 国内精品免费午夜毛片| 成年网站在线| 精品久久久久久久久久久久久久久久久 | 粉嫩aⅴ一区二区三区四区五区 | 色呦呦一区二区| 久久精品国产亚洲aⅴ| 国产精品入口芒果| 四季av一区二区三区免费观看| 日韩美女主播视频| 色屁屁www国产馆在线观看| 国产亚洲人成a一在线v站| 成 人 免费 黄 色| 欧美午夜一区二区| 国产一级一片免费播放| 国产免费观看久久| 东京热av一区| 韩国毛片一区二区三区| 国产aaa一级片| 韩日在线一区| 一区二区三区欧美在线| 亚洲涩涩av| 不卡日韩av| 国产精品18| 国产精品一二三在线| 亚洲欧美一区二区三区| 久久男人资源视频| 深夜国产在线播放| 久久av中文字幕| 日本视频在线观看| 中文字幕精品在线视频| 黄色网址在线播放| 日韩电视剧在线观看免费网站| 亚洲成熟少妇视频在线观看| 夜夜嗨av一区二区三区网页| 神马午夜精品91| 国产精品国产三级国产a| 男人天堂av电影| 久久久无码精品亚洲日韩按摩| 鲁一鲁一鲁一鲁一av| 国产精品婷婷| 欧美日韩在线视频一区二区三区| 久久免费大视频| 日韩av电影免费播放| 国产精品手机在线播放| 欧美久久久久久久| 亚洲激情播播| 欧美国产视频在线观看| 国产精品羞羞答答在线观看| 欧美午夜欧美| 国精一区二区| 水蜜桃一区二区| 久久中文字幕av| 在线观看一区二区三区三州| 99久久激情| 欧美少妇一区二区三区| 午夜欧美精品| 日本人体一区二区| 国产日韩欧美一区二区三区在线观看 | 国产精品50p| 欧美专区一区二区三区| 国产淫片av片久久久久久| 丝袜美腿成人在线| 成人性生交免费看| 九一九一国产精品| 性xxxxxxxxx| 91视视频在线观看入口直接观看www | 欧美久久久久久蜜桃| 国产无遮挡又黄又爽又色视频| 亚洲午夜久久久久中文字幕久| jizz中文字幕| 国产精品人成在线观看免费 | 久久国产色av免费观看| 日韩精品三区四区| 久久久久久久久久一区| 国产呦精品一区二区三区网站| 国产精品无码专区av在线播放| 韩日精品视频| 国产乱子夫妻xx黑人xyx真爽 | 久热国产精品视频| 三级福利片在线观看| 97久久精品人搡人人玩| 性欧美1819sex性高清| 国产精品亚发布| 日本在线成人| 欧美精品中文字幕一区二区| 欧美丰满老妇| 蜜臀av色欲a片无码精品一区 | av在线播放亚洲| 日韩精品午夜视频| 久久无码人妻一区二区三区| 97久久超碰精品国产| 91无套直看片红桃在线观看| 一区二区三区免费网站| 在线永久看片免费的视频| 欧美巨大另类极品videosbest | 精品亚洲aⅴ无码一区二区三区| 白白色 亚洲乱淫| 欧美色图亚洲激情| 中文字幕亚洲欧美在线不卡| 日韩三级免费看| 欧美麻豆精品久久久久久| 日韩在线观看视频网站| 日韩在线观看精品| 中文字幕在线视频久| 99porn视频在线| 国内精品久久久久久久久电影网| 日本高清久久一区二区三区| 欧美黄色aaaa| 99视频在线视频| 北条麻妃国产九九精品视频| 日韩精品一区二区亚洲av性色 | 亚洲欧美日韩中文在线| 菠萝菠萝蜜在线观看| 国产精品白嫩初高中害羞小美女| 日韩av超清在线观看| 国产精品播放| 五月婷婷亚洲| 爱情岛论坛成人| 99久久精品费精品国产一区二区| 一区二区三区免费在线观看视频| 91麻豆swag| 免费毛片在线播放免费| 欧美日韩dvd在线观看| 激情小说 在线视频| **欧美日韩vr在线| 一区二区三区亚洲变态调教大结局| 国产精品国色综合久久| 亚洲乱码电影| xxww在线观看| 日本一区二区三区久久久久久久久不| 嘿嘿视频在线观看| 欧美日韩一区二区在线| 亚洲成人精品女人久久久| 久久精品中文字幕| 六九午夜精品视频| 午夜精品福利一区二区| 久久精品五月| 91中文字幕永久在线| 欧美日韩激情小视频| 亚洲av激情无码专区在线播放| 亚洲人成网站777色婷婷| av资源网在线播放| www.一区二区三区| 欧美激情性爽国产精品17p| 亚洲制服在线观看| 亚洲蜜臀av乱码久久精品| 国产精品久久久久久久久久久久久久久久久久 | 日韩视频免费观看| 99tv成人影院| 五月天色婷婷综合| 国内外成人在线| 男人的午夜天堂| 欧美久久久久免费| 中文字幕在线观看网站| 99久久一区三区四区免费| 黄色成人在线网址| 黄色性视频网站| 午夜欧美视频在线观看| 色呦呦中文字幕| 欧美资源在线观看| 国语产色综合| 不卡的在线视频| 亚洲精品国久久99热| 亚洲精品一区二区口爆| 国内成人精品一区| 西瓜成人精品人成网站| 精品久久久噜噜噜噜久久图片| 成人激情文学综合网| 在线天堂中文字幕| 亚洲天堂av图片| 日本国产一区| 久久亚洲a v| 91女厕偷拍女厕偷拍高清| 日韩精选在线观看| 久久久精品在线| 亚洲综合网狠久久| 成年人视频在线免费| 国产精品久久久久久久久动漫| yjizz国产| 中文字幕精品视频| 91麻豆精品国产91久久久久推荐资源| 亚洲高清视频一区二区| 国产一本一道久久香蕉| 日本三级视频在线| 亚洲最大中文字幕| 国内不卡的一区二区三区中文字幕| 日本视频一区在线观看| 麻豆91精品91久久久的内涵| 五月婷婷一区二区| 国产丝袜精品第一页| 欧美系列精品| 免费观看国产精品视频| 亚洲国产精品成人综合色在线婷婷| 少妇久久久久久久| 欧美插天视频在线播放| 亚洲美女久久| 能看毛片的网站| 色综合久久综合网97色综合| www在线免费观看视频| 久久婷婷开心| 国产乱理伦片在线观看夜一区| 蜜臀久久精品久久久用户群体|