用Java怎么调用C语言已经编写好的DLL? java程序能直接调用C写好的dll文件吗?

\u7528Java\u600e\u4e48\u8c03\u7528C\u8bed\u8a00\u5df2\u7ecf\u7f16\u5199\u597d\u7684DLL\uff1f

\u76f4\u63a5\u7528\uff0c\u662f\u7528\u4e0d\u4e86\u7684\uff0cjava\u548cC\u7684\u63a5\u53e3\u53ebJNI\uff0c\u5fc5\u987b\u4f7f\u7528jni\u6765\u4ea4\u4e92\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u4f60\u5fc5\u987b\u6709C\u5f00\u53d1\u4eba\u5458\u7ed9\u4f60\u5305\u88c5\u4f60\u60f3\u7528\u7684dll

JAVA\u901a\u8fc7JNI\u8c03\u7528\u672c\u5730\u65b9\u6cd5\uff0c\u800c\u672c\u5730\u65b9\u6cd5\u662f\u4ee5\u5e93\u6587\u4ef6\u7684\u5f62\u5f0f\u5b58\u653e\u7684\uff08\u5728WINDOWS\u5e73\u53f0\u4e0a\u662fDLL\u6587\u4ef6\u5f62\u5f0f\uff0c\u5728UNIX\u673a\u5668\u4e0a\u662fSO\u6587\u4ef6\u5f62\u5f0f\uff09\u3002\u901a\u8fc7\u8c03\u7528\u672c\u5730\u7684\u5e93\u6587\u4ef6\u7684\u5185\u90e8\u65b9\u6cd5\uff0c\u4f7fJAVA\u53ef\u4ee5\u5b9e\u73b0\u548c\u672c\u5730\u673a\u5668\u7684\u7d27\u5bc6\u8054\u7cfb\uff0c\u8c03\u7528\u7cfb\u7edf\u7ea7\u7684\u5404\u63a5\u53e3\u65b9\u6cd5\u3002
\u7b80\u5355\u4ecb\u7ecd\u53ca\u5e94\u7528\u5982\u4e0b\uff1a
\u4e00\u3001JAVA\u4e2d\u6240\u9700\u8981\u505a\u7684\u5de5\u4f5c
\u5728JAVA\u7a0b\u5e8f\u4e2d\uff0c\u9996\u5148\u9700\u8981\u5728\u7c7b\u4e2d\u58f0\u660e\u6240\u8c03\u7528\u7684\u5e93\u540d\u79f0\uff0c\u5982\u4e0b\uff1a
static {
System.loadLibrary(\u201cgoodluck\u201d);
}

\u5728\u8fd9\u91cc\uff0c\u5e93\u7684\u6269\u5c55\u540d\u5b57\u53ef\u4ee5\u4e0d\u7528\u5199\u51fa\u6765\uff0c\u7a76\u7adf\u662fDLL\u8fd8\u662fSO\uff0c\u7531\u7cfb\u7edf\u81ea\u5df1\u5224\u65ad\u3002
\u8fd8\u9700\u8981\u5bf9\u5c06\u8981\u8c03\u7528\u7684\u65b9\u6cd5\u505a\u672c\u5730\u58f0\u660e\uff0c\u5173\u952e\u5b57\u4e3anative\u3002\u5e76\u4e14\u53ea\u9700\u8981\u58f0\u660e\uff0c\u800c\u4e0d\u9700\u8981\u5177 \u4f53\u5b9e\u73b0\u3002\u5982\u4e0b\uff1a
public native static void set(int i);
public native static int get();
\u7136\u540e\u7f16\u8bd1\u8be5JAVA\u7a0b\u5e8f\u6587\u4ef6\uff0c\u751f\u6210CLASS\uff0c\u518d\u7528JAVAH\u547d\u4ee4\uff0cJNI\u5c31\u4f1a\u751f\u6210C/C++\u7684\u5934\u6587\u4ef6\u3002
\u4f8b\u5982\u7a0b\u5e8ftestdll.java\uff0c\u5185\u5bb9\u4e3a\uff1a
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);

public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}

\u7528javac testdll.java\u7f16\u8bd1\u5b83\uff0c\u4f1a\u751f\u6210testdll.class\u3002
\u518d\u7528javah testdll\uff0c\u5219\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210testdll.h\u6587\u4ef6\uff0c\u8fd9\u4e2a\u6587\u4ef6\u9700\u8981\u88abC/C++\u7a0b\u5e8f\u8c03\u7528\u6765\u751f\u6210\u6240\u9700\u7684\u5e93\u6587\u4ef6\u3002

1. 编写范例文档 public class TestNative { private native static int Max(int a,int b); public static void main(String[] args) { System.out.println(Max(4,5)); } static { System.loadLibrary("VCdll"); } } 其中 LoadLibrary中的DLL文件名称可以随便定.只要做好的动态链接库改名成这个字符串就可以了.而native函数的来源就是该动态链接库. 2. 做好该步准备以后,用javac TestNative.java生成TestNative.class. 检验语法. 3. 语法检查通过以后,用javah TestNative生成TestNative.h的C++头文件. 4. 用VC++6.0创建dll文件: <1>msdev->new->project->win32 Dynamic-Link Library <2>Enter project name (e.g. VCdll) <3>choose "An empty DLL project"->finish <4>将3生成的TestNative.h和jdk下的jni.h和jni_md.h加入到工程中去 <5>Create a c++ file, implements the native method. as follows: //TestNative.cpp #include "TestNative.h" JNIEXPORT jint JNICALL Java_TestNative_Max (JNIEnv * a, jclass b, jint x, jint y) { return x > y ? x : y; } 备注: A 其中的jni.h通常在 jdk\include\ 可以先拷贝到VC安装目录下的include目录下.一劳永逸,以后可以方便使用JNI技术. B 全部的数据类型需要考虑Java和VC的接口问题.用jint jstring 等. C 函数名称和自动生成的.h文件中规定的一致.命名规则是: Java_使用类_方法名 6. 全编译一下VC++工程. 如果没有出错,则此时生成动态链接库成功. 把动态链接库VCdll.dll拷贝到TestNative.java所在的目录上. 7.运行java TestNative. OK :-)
参考资料: http://hi.baidu.com/dinguangx/blog/item/196560017e40e2031c95832f.html

1.用System.getProperty("user.dir"),获取程序的路径,估计你的应该是 E:\\测试程序不清楚打印一下就可以了。System.getProperty("user.dir") + "\\DLL\\CardAPI"2.unsigned char 用char就可以了unsigned int 用int就可以了,java的int值很大.....C的无符号的记得是65535 unsigned char*、和unsigned int* 这两个是指针,第一个是取1位地址内容的,第二个根据系统而定,一般是取4位地址值的,用java 的String对应,应该可以 。

我使用过的是 JNative。具体使用方法见:http://ejb-wawa.javaeye.com/blog/188662

  • Java濡備綍璋冪敤C璇█浠g爜 ?
    绛旓細鏂规硶涓嶅寘鎷疄鐜帮紝鍥犱负鎴戜滑瑕佺敤c/c++璇█瀹炵幇瀹冦傛敞鎰廠ystem.loadLibrary("hello")杩欏彞浠g爜锛屽畠鏄湪闈欐佸垵濮嬪寲鍧椾腑瀹氫箟鐨勶紝绯荤粺鐢ㄦ潵瑁呰浇hello鍏变韩搴擄紝杩欏氨鏄垜浠湪鍚庨潰鐢熸垚鐨刪ello.dll锛堝鏋滃湪鍏朵粬鐨勬搷浣滅郴缁熷彲鑳芥槸鍏朵粬鐨勫舰寮忥紝姣斿hello.so锛 缂栬瘧java浠g爜 javac HelloWorld.java 鐢熸垚HelloWorld.class鏂囦欢 ...
  • JAVA濡備綍璋冪敤C璇█鎺ュ彛?
    绛旓細绗竴锛jni鏂瑰紡璋冪敤c鎺ュ彛銆傞氳繃灏哻璇█鎺ュ彛灏佽涓簀ni鐨勬柟寮忕洿鎺ヤ緵java璇█璋冪敤锛岃繖涓彲浠ヨ鏄渶鎯敤鐨勬柟寮忋傜浜岋紝jna鏂瑰紡璋冪敤c鎺ュ彛銆俲na涔熸槸鍏朵腑涓绉嶈皟鐢╟鎺ュ彛鐨勬柟寮忋備娇鐢ㄦ椂鍙互鍔犺浇鍔ㄦ佸簱.dll鎴.so锛岀劧鍚庤皟鐢ㄥ簱涓殑鎺ュ彛銆傜涓夛紝濡傛灉c鎺ュ彛寰堢畝鍗曪紝鍙互灏哻鎺ュ彛缂栬瘧涓哄彲鎵ц绋嬪簭锛屼娇鐢╦ava鐩存帴璋冪敤鍙墽琛...
  • 鐢↗ava鎬庝箞璋冪敤C璇█宸茬粡缂栧啓濂界殑DLL?
    绛旓細1. 缂栧啓鑼冧緥鏂囨。 public class TestNative { private native static int Max(int a,int b); public static void main(String[] args) { System.out.println(Max(4,5)); } static { System.loadLibrary("VCdll"); } } 鍏朵腑 LoadLibrary涓殑DLL鏂囦欢鍚嶇О鍙互闅忎究瀹.鍙鍋氬ソ鐨勫姩鎬侀摼鎺ュ簱鏀瑰悕鎴...
  • 浠涔堟牱鐨勬妧鏈兘璁java璋冪敤c璇█鐨勪唬鐮
    绛旓細java琚紪璇戞垚瀛楄妭鐮佸悗鐢盝VM瑙i噴鎵ц锛宩ava瑕佽皟鐢–璇█鍐欑殑绋嬪簭锛閭d箞灏卞繀椤婚氳繃JVM璋冪敤锛宩ava鍛婅瘔JVM鎴戣璋冪敤鏈湴鎿嶄綔绯荤粺鐨勯偅涓▼搴忔锛堝dll锛夊苟瑕佹眰杩斿洖涓涓粨鏋溿傞氳繃JVM璋冪敤鏈湴绋嬪簭鐨勬妧鏈氨鏄疛NI锛宩ava Native interface(鏈湴鎺ュ彛鎶鏈)銆俲ava鏄氳繃铏氭嫙鏈哄疄鐜拌法骞冲彴鎶鏈殑锛屽洜姝よ璋冪敤鏈湴鎿嶄綔绯荤粺鐩...
  • java鎬庝箞寮曠敤c
    绛旓細浣跨敤Java鐨凧NI鎶鏈傚叿浣撹皟鐢ㄦ楠ゅ涓嬶細1.棣栧厛鍒涘缓Java鏂囦欢 HelloJni.java 锛屽苟鍒涘缓native鏂规硶銆2.缂栬瘧Java鏂囦欢骞剁敓鎴恓ava澶存枃浠躲3.鍒涘缓C璇█鏂囦欢锛孒elloWorld.c銆4.鐢熸垚鍔ㄦ侀摼鎺ュ簱鏂囦欢 libhello.so銆5.璁剧疆鍔ㄦ侀摼鎺ュ簱鏂囦欢鐨勭洰褰曘6.鎶婂垰鎵嶇敓鎴愮殑so鏂囦欢鎷疯礉鍒/home/lib涓嬶紝鐒跺悗鎵цclass鏂囦欢銆
  • java濡備綍璋冪敤c璇█婧愭枃浠跺苟杩涜鎵ц?
    绛旓細瑕佸湪java涓璋冪敤c璇█鐨勫簱,闇瑕浣跨敤Java鎻愪緵浜咼NI銆俓x0d\x0a涓句緥璇存槑\x0d\x0a鍦╟璇█涓畾涔変竴涓 void sayHello()鍑芥暟(鎵撳嵃Hello World);鐒跺悗鍦Java涓皟鐢杩欎釜鍑芥暟鏄剧ずHello Word.\x0d\x0a鐜板湪鍒嗗埆浠嶫ava鍜孋璇█涓ら儴鍒嗚鏄:\x0d\x0a1. Java 閮ㄥ垎\x0d\x0a棣栧厛瀹氫箟涓涓狧elloNative,鍦ㄥ叾涓...
  • 鎬庢牱鑳藉湪Java涓皟鐢–璇█鐢熸垚鐨凞LL鏂囦欢
    绛旓細涓銆 鐢熸垚C鐨勫ご鏂囦欢 1. 缂栬緫Main.java public class Main { public native static int getStrNum(byte str[], int strLen); }2. 鐢熸垚澶存枃浠 鎸墂in + r鎵撳紑鈥滆繍琛屸濈獥鍙o紝杈撳叆鈥渃md鈥濓紝鎵撳紑DOS鎺у埗鍙扮獥鍙c傝繘鍏ヤ笂闈ain.java鎵鍦ㄧ殑鐩綍涓紝杈撳叆锛 javac Main.java javah Main 涓ゆ潯鍛戒护瀹屾垚鍚...
  • java璋冪敤c璇█缂栧啓鐨勫彲鎵ц鏂囦欢
    绛旓細int main(string argv[]){ char a[100];strcpy(a,argv[0]);} 浼犲叆鐨勫瓧涓插瓧绗︿釜鏁颁笉鑳借秴杩100涓瓧绗︼紝鐢ㄦ寚閽堝彲浠ラ伩鍏嶈繖涓闂锛孋++浠g爜濡備笅锛歩nclude<iostream> using namespace std;typedef char *String;int main(String argv[]){ String str;str=argv[0];} Java璋冪敤浠g爜濡備笅鎵绀猴細Runtime....
  • 鎬庝箞鐢╦ava 璇诲彇c璇█缂栧啓鐨勪簩杩涘埗鏂囦欢
    绛旓細\\鍋囪鏂囦欢鐨勫湴鍧涓篴.txt FileInputStream in=new FileInputStream(new File("a.txt"));byte[] buffer=new byte[4096];int offset=0;while((offset=in.read(buffer)>-1){ //杩宸茬粡鎶婃枃浠惰鍏ュ埌buffer涓簡锛岃寖鍥翠负0鍒皁ffset锛屼綘鍙互鍋氫换浣曞鐞嗕簡 } in.close();...
  • java缂栧啓鐨勭▼搴忎笌C璇█缂栧啓鐨勭▼搴鎬庝箞杩涜閫氫俊
    绛旓細鎮ㄥソ锛屼綘鍙互鐢ㄤ袱涓笉鍚岃繘绋嬩箣闂寸殑鏁版嵁浜や簰锛1銆佸彲浠ラ夋嫨socket閫氫俊 2銆佸彲浠ラ夋嫨鏂囦欢锛屼笉杩囪娉ㄦ剰濂借鍐 3銆佹秷鎭紶閫掞紝鍦╳indows涓嬫姏鍑轰竴涓秷鎭//鍏蜂綋鎬庝箞鍋氭垜娌¤瘯杩囷紝鍙煡閬撴湁杩欐柟娉 4銆佹暟鎹簱//杩欎釜姣旇緝瀹规槗瀹炵幇 杩欐牱灏卞彲浠ラ夋嫨鐢ㄤ笉鍚璇█鍐欏嚭鏉ョ殑绋嬪簭浜 ...
  • 扩展阅读:学java要先学c语言吗 ... java难还是c语言难 ... 学java一般能干什么 ... java编程零基础入门 ... c++和java哪个好就业 ... java调用c语言接口 ... java自学要学多久 ... java编程代码大全免费 ... 初学者先学c语言还是java ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网