java的lang包,JNI java.lang.UnsatisfiedLinkError

 2023-11-19 阅读 23 评论 0

摘要:錯誤1: java.lang.Unsatisfie.lang.UnsatisfiedLinkError no XXXXX in java.library.path 這個錯誤一般是找不到dll文件 執行下這個 可以看看 System.out.println(System.getProperty("java.library.path")); 其實就是我們設置的path 環境變量里的東西或者有其

錯誤1: java.lang.Unsatisfie.lang.UnsatisfiedLinkError no XXXXX in java.library.path

這個錯誤一般是找不到dll文件

執行下這個 可以看看 System.out.println(System.getProperty("java.library.path")); 其實就是我們設置的path 環境變量里的東西或者有其他系統的設置。(在windows cmd下 輸入path 或者 set 都可以看)。看了這個以后你就知道這個dll或者so文件放哪里他是可以找到了,當然最簡單的放這個java文件所在的目錄了或者他上層目錄,一般是和java src目錄同層目錄就好了,你看下java.library.path 中有個點號(.) 就表明是當前工作目錄的意思,所以肯定在工程目錄下有個位置。這個錯誤一般比較好解決。


錯誤2:java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()

這個錯誤是 在這個dll里找不到方法的聲明,(搞了一下午害我差點裝VC了,還借用到了dll查看工具)

網上說是@符號的問題 ,解決方法是用gcc 編譯的時候指定參數

第1種方法:

gcc -Wl,--kill-at -shared -o jnihello.dll Native.c

這種方法生成不帶@的函數聲明

第2種方法:
gcc -Wl,--add-stdcall-alias -shared -o jnihello22.dll Native.c

這種方法會生成2個函數聲明,一個是帶@的 一個是不帶@的。

第3種方法:

在你的本地方法的頭文件中中的函數前面加上下劃線,比如以前是

JNIEXPORT void JNICALL Java_TestNative_Hello (JNIEnv * , jobject );

現在改成

JNIEXPORT void JNICALL _Java_TestNative_Hello (JNIEnv * , jobject );

同時你的實現的cpp文件或者c文件里的函數頭也要一致 前面有下劃線。java的lang包,

如果你需要查看dll的導出函數聲明可以用以下2個工具

1: dllexp

2:Anywhere PE Viewer

轉載于:https://www.cnblogs.com/yefengmeander/archive/2012/11/13/2887967.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/179229.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息