1. 主页 > 小妙招

解决Java调用DLL报错:从UnsatisfiedLinkError到成功运行

鈥?strong>鈥嬪搸鍝熷杺锛佷綘鐨凧ava绋嬪簭鏄笉鏄崱鍦║nsatisfiedLinkError浜嗭紵鈥?/strong>鈥?br/> 鍜卞氨鏄锛屼絾鍑$敤Java璋冭繃DLL鐨勮€侀搧锛屽崄涓湁涔濅釜閮借杩欎釜鎶ラ敊鎶樼(杩囥€備笉杩囧埆鎱岋紝浠婂ぉ鍜变滑灏辨潵鍞犲敔杩欎釜纾ㄤ汉鐨勫皬濡栫簿鍒板簳鎬庝箞娌伙紒


涓€銆佽繖涓敊璇埌搴曞湪璇村暐锛?/h3>

鈥?strong>鈥?UnsatisfiedLinkError"缈昏瘧鎴愪汉璇濆氨鏄細鈥?/strong>鈥?br/> "鍏勫紵鍟婏紝浣犺鐨勯偅涓狣LL鎴戠炕閬嶅叏鏉戦兘鎵句笉鐫€鍟婏紒" 鎴栬€?"澶у摜锛屼綘璁╂垜鎵ц鐨勫嚱鏁版垜鍘嬫牴涓嶈璇嗗晩锛?

鈥?strong>鈥嬩妇涓牀瀛愷煂帮細鈥?/strong>鈥?br/> 浣犺鏄妸DLL鏂囦欢褰撴垚澶栧崠鍦板潃锛孞ava灏辨槸閭d釜閫侀鍛樸€傛姤閿欑殑鎰忔€濊涔堟槸澶栧崠鍛樿糠璺簡锛堟壘涓嶅埌DLL锛夛紝瑕佷箞鏄簵瀹剁粰閿欎簡鍙栭鐮侊紙鍑芥暟绛惧悕涓嶅锛夈€?/p>


浜屻€佷笁澶х炕杞︾幇鍦轰笌鎬ユ晳鏂规

1. 鈥?strong>鈥婦LL鐜╁け韪紵璺緞闂鍗犱竷鎴愶紒鈥?/strong>鈥?/h4>

鈥?strong>鈥嬬粡鍏哥棁鐘讹細鈥?/strong>鈥?br/> 鏄庢槑鎶奃LL鏀惧湪椤圭洰鏍圭洰褰曚簡锛岀▼搴忚繕鏄鎵句笉鍒般€傝繖鏃跺€欎綘鍙兘浼氭兂锛?鎴戞槸涓嶆槸琚獼ava閽堝浜嗭紵"

鈥?strong>鈥嬫€ユ晳涓夎繛锛氣€?/strong>鈥?/p>

  • 鈥?strong>鈥嬬洿鎺ヨ矾寰勫姞杞芥硶锛氣€?/strong>鈥?br/> System.load("C:/dlls/mylib.dll") 锛堝氨鍍忕洿鎺ユ姤闂ㄧ墝鍙凤級
  • 鈥?strong>鈥嬬幆澧冨彉閲忓ぇ娉曪細鈥?/strong>鈥?br/> 鎶奃LL鎵€鍦ㄧ洰褰曞姞鍒癙ATH閲岋紙鐩稿綋浜庣粰澶栧崠鍛樼敾鍦板浘锛?/li>
  • 鈥?strong>鈥嬭祫婧愭枃浠跺す鐜勫锛氣€?/strong>鈥?br/> 鎶奃LL鎵斿埌src/main/resources鐩綍锛圡aven/Gradle椤圭洰鐨勪繚鍛戒綅缃級

鈥?strong>鈥嬩釜浜鸿俯鍧戠粡楠岋細鈥?/strong>鈥?br/> 鏈夋鎴戞妸DLL鏀惧湪妗岄潰璋冪敤锛屾娲诲姞杞戒笉涓娿€傚悗鏉ユ墠鍙戠幇Windows妗岄潰璺緞鏈夌┖鏍硷紙C:/Users/鎴戠殑 鐢佃剳/Desktop锛夛紝鏀规垚鍏ㄨ嫳鏂囪矾寰勭灛闂村氨濂戒簡銆傛墍浠ュ晩锛屸€?strong>鈥嬭矾寰勯噷鍗冧竾鍒敤涓枃鍜岀┖鏍硷紒鈥?/strong>鈥?/p>


2. 鈥?strong>鈥?2浣嶅拰64浣嶇殑鎭╂€ㄦ儏浠団€?/strong>鈥?/h4>

鈥?strong>鈥嬭繖涓潙鎴戞暍璇村叓鎴愭柊鎵嬮兘鏍借繃锛佲€?/strong>鈥?br/> Java鍜孌LL灏卞儚铻轰笣鍜岃灪姣嶏紝灏哄涓嶅纭嫥鑲畾鍑洪棶棰樸€?/p>

缁勫悎鎯呭喌缁撴灉瑙e喅鏂规硶
32浣岼DK + 32浣岲LL鉁?瀹岀編杩愯淇濇寔闃熷舰
64浣岼DK + 64浣岲LL鉁?涓濇粦娴佺晠娉ㄦ剰缂栬瘧鍣ㄩ€夐」
32浣岼DK + 64浣岲LL鉂?褰撳満宕╂簝鎹DK鎴栭噸鏂扮紪璇慏LL
64浣岼DK + 32浣岲LL鉂?鐩存帴韬哄钩浣跨敤缁熶竴鐨?4浣嶇幆澧?/td>

鈥?strong>鈥嬫鏌ヤ綅鏁扮殑楠氭搷浣滐細鈥?/strong>鈥?/p>

  • 鍦╟md杈撳叆java -version锛屽甫"64-Bit"灏辨槸64浣岼DK
  • 鐢―ependency Walker鏌ョ湅DLL浣嶆暟锛堝氨鍍忕粰DLL鎷峏鍏夌墖锛?/li>

3. 鈥?strong>鈥嬪嚱鏁扮鍚嶅涓嶄笂锛熼兘鏄粏鑺傛児鐨勭ジ鈥?/strong>鈥?/h4>

鈥?strong>鈥嬭繖閲屾湁涓湡瀹炴渚嬶細鈥?/strong>鈥?br/> 鏈夊摜浠珻++閲屽啓鐨勫嚱鏁板彨int add(int a, int b)锛孞ava璋冪敤姝绘椿鎶ラ敊銆備綘鐚滀负鍟ワ紵鈥?strong>鈥婮NI瑕佹眰鍑芥暟鍚嶅繀椤诲甫鍖呰矾寰勶紒鈥?/strong>鈥?/p>

鈥?strong>鈥嬫纭啓娉曞簲璇ユ槸锛氣€?/strong>鈥?br/> JNIEXPORT jint JNICALL Java_com_example_MyClass_add(JNIEnv *, jobject, jint a, jint b)

鈥?strong>鈥嬮槻缈昏溅鎸囧崡锛氣€?/strong>鈥?/p>

  1. 鐢?code>javac -h鑷姩鐢熸垚澶存枃浠讹紙鐩稿綋浜庤Java鑷繁鍐欐儏涔︼級
  2. 妫€鏌++鍑芥暟鍚嶆湁娌℃湁鍖呭惈锛?
    • 瀹屾暣鍖呭悕
    • 绫诲悕
    • 鏂规硶鍚?/li>
  3. 娉ㄦ剰鍙傛暟绫诲瀷杞崲锛坖int瀵瑰簲int锛宩string瀵瑰簲string锛?/li>

涓夈€佺粷鍦版眰鐢熷繀澶囧伐鍏峰寘

鈥?strong>鈥嬭繖鍑犱釜绁炲櫒鑳借浣犲皯鎺?0%澶村彂锛氣€?/strong>鈥?/p>

  1. 鈥?strong>鈥婦ependency Walker鈥?/strong>鈥嬶細鏌ョ湅DLL渚濊禆鍏崇郴鍜屼綅鏁帮紙灏卞儚DLL鐨勪綋妫€鎶ュ憡锛?/li>
  2. 鈥?strong>鈥婸rocess Monitor鈥?/strong>鈥嬶細瀹炴椂鐩戞帶Java鍔犺浇DLL鐨勮繃绋嬶紙鐩稿綋浜庣粰绋嬪簭瑁呯洃鎺ф憚鍍忓ご锛?/li>
  3. 鈥?strong>鈥婮NAerator鈥?/strong>鈥嬶細鑷姩鐢熸垚JNA鏄犲皠浠g爜锛堟噿浜烘晳鏄燂級

鈥?strong>鈥嬩妇涓疄鐢ㄥ満鏅細鈥?/strong>鈥?br/> 褰撲綘鐪嬪埌鎺у埗鍙版姤java.lang.UnsatisfiedLinkError: my.dll: 鎵句笉鍒版寚瀹氱殑妯″潡锛岀敤Dependency Walker鎵撳紑DLL锛屽鏋滅湅鍒扮孩鑹叉劅鍙瑰彿鏍囪鐨勪緷璧栭」锛岃鏄庝綘鐨凞LL杩樼己鍏朵粬渚濊禆搴擄紝璧剁揣鍘讳笅杞借ˉ榻愬惂锛?/p>


鍥涖€佺粓鏋佹牳姝﹀櫒鈥斺€斾竾鑳芥帓閿欐祦绋?/h3>

瑕佹槸涓婇潰杩欎簺鎷涢兘璇曡繃浜嗚繕娌¤В鍐筹紝璇曡瘯杩欎釜鈥?strong>鈥嬩節闃崇鍔熷績娉曗€?/strong>鈥嬶細

  1. 閲嶅惎IDE锛堢巹瀛﹀ぇ娉曟湁鏃剁湡绠$敤锛?/li>
  2. 娓呯悊椤圭洰閲嶆柊缂栬瘧
  3. 妫€鏌ユ潃姣掕蒋浠舵槸涓嶆槸鎶奃LL褰撶梾姣掗殧绂讳簡
  4. 鐢ㄧ粷瀵硅矾寰勫姞杞紻LL娴嬭瘯
  5. 鎹㈠彴鐢佃剳璇曡瘯锛堟帓闄ょ幆澧冮棶棰橈級
  6. 鎶奃LL鏀瑰悕涓?dll.bak鐪嬫姤閿欐槸鍚﹀彉鍖栵紙纭鍔犺浇鐨勬槸姝g‘鏂囦欢锛?/li>
  7. 鍦–++浠g爜閲屽姞鏃ュ織杈撳嚭
  8. 鍦↗ava绔墦鍗?code>java.library.path鍐呭
  9. 涓奡tackoverflow鎼滈敊璇俊鎭叧閿瘝

鈥?strong>鈥嬩釜浜哄績寰楋細鈥?/strong>鈥?br/> 鏈夋鎴戦亣鍒颁釜濂囪懇闂锛屾姌鑵句袱澶╂病瑙e喅銆傚悗鏉ュ彂鐜版槸鍥犱负DLL鏂囦欢鍚嶅啓鎴愪簡"mylib.DLL"锛堝ぇ鍐欐墿灞曞悕锛夛紝鑰孞ava浠g爜閲屽啓鐨勬槸"mylib.dll"銆俉indows铏界劧涓嶅尯鍒嗗ぇ灏忓啓锛屼絾Linux鐜涓嬭繖灏辨槸鑷村懡閿欒銆傛墍浠ュ晩锛屸€?strong>鈥嬫枃浠跺悕鍗冧竾瑕佸畬鍏ㄥ尮閰嶏紒鈥?/strong>鈥?/p>


鈥?strong>鈥嬫渶鍚庤鐐规帍蹇冪獫瀛愮殑璇濓細鈥?/strong>鈥?br/> 璋僁LL杩欎簨鍎垮惂锛屽氨鍍忕帺瀵嗗閫冭劚銆傝櫧鐒惰繃绋嬭檺蹇冿紝浣嗚В鍐抽棶棰樼殑鎴愬氨鎰熶篃鏄疄瀹炲湪鍦ㄧ殑銆傝浣忎笁鐐规牳蹇冭涔夛細鈥?strong>鈥嬭矾寰勮瀵广€佷綅鏁拌閰嶃€佺鍚嶈鍑嗏€?/strong>鈥嬨€傞亣鍒版姤閿欏埆鎬ョ潃鐮搁敭鐩橈紝鎸夌潃鏈枃鐨勬楠や竴姝ユ鎺掓煡锛屼繚鍑嗕綘鑳戒粠鍏ラ棬鍒扮簿閫氥€?/p>

瑕佹槸杩樻悶涓嶅畾锛屾杩庢潵璇勮鍖哄敔鍡戔€斺€旇涓嶅畾浣犻亣鍒扮殑鍧戯紝姝f槸鍒汉韪╄繃鐨勯浄鍛紒姣曠珶鍦ㄧ紪绋嬬殑涓栫晫閲岋紝娌℃湁瑙e喅涓嶄簡鐨刡ug锛屽彧鏈夋殏鏃舵病鎵惧埌鏂规硶鐨勫€斿己~

本文由嘻道妙招独家原创,未经允许,严禁转载