日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java+构造函数+native_java中native的用法

發布時間:2023/12/9 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java+构造函数+native_java中native的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

public static native void ?java.lang.System.arraycopy(Object, int, Object, int, int)方法竟然是native的,

查詢了一下java中native的用法,找到如下文章,

學習了:https://www.cnblogs.com/b3051/p/7484501.html

但是,自己手癢,寫了一下,結果,填了幾個坑;

1,javah 之前沒有使用過,用起來還算可以,中規中矩;

2,編寫C文件也還可以;隨便寫,結果就挖了一個坑;

3,使用cl編譯有些問題,有些文章說要安裝Visio Studio 20XX,

學習了:http://blog.163.com/yuyang_tech/blog/static/2160500832013118112049372/

決定使用vc6.0來做,

下載地址:http://www.pc6.com/softview/SoftView_51072.html

解壓至D:\pvc6\VC98\BIN,在添加到系統path中;

后來發現我把D:\pvc6\COMMON\MSDEV98\BIN;D:\pvc6\VC98\INCLUDE也加到路徑里面了;忘記為啥了;

出錯1:

D:\Java\gitworkspace\Coding\bin>CL.EXE -I%java_home%\include -I%java_home%\inclu

de\win32 -LD JavaNativeImp.c -Fehello.dll

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86

Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

JavaNativeImp.c

D:\Java\jdk1.8.0_05\include\jni.h(39) : fatal error C1083: Cannot open include f

ile: 'stdio.h': No such file or directory

開始模擬 -I參數,

CL.EXE -I%java_home%\include -I%java_home%\include\win32 -ID:\pvc6\VC98\INCLUDE -LD JavaNativeImp.c -Fehello.dll

出錯2:

D:\Java\gitworkspace\Coding\bin>CL.EXE -I%java_home%\include -I%java_home%\inclu

de\win32 -ID:\pvc6\VC98\INCLUDE -LD JavaNativeImp.c -Fehello.dll

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86

Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

JavaNativeImp.c

Microsoft (R) Incremental Linker Version 6.00.8168

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/dll

/implib:hello.lib

/out:hello.dll

JavaNativeImp.obj

LINK : fatal error LNK1104: cannot open file "LIBCMT.lib"

找不到參數可以加lib了,

學習了:http://blog.csdn.net/cruise_h/article/details/29218407

在我的電腦->屬性->高級系統設置->環境變量->系統變量中新建系統變量LIB、INCLUDE并設置它們的值為:

LIB:D:\pvc6\VC98\LIB

INCLUDE:%java_home%\include;%java_home%\include\win32;D:\pvc6\VC98\INCLUDE

這樣直接輸入:cl -LD JavaNativeImp.c -Fehello.dll就可以編譯了;

輸出:

D:\Java\gitworkspace\Coding\bin>cl -LD JavaNativeImp.c -Fehello.dll

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86

Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

JavaNativeImp.c

Microsoft (R) Incremental Linker Version 6.00.8168

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/dll

/implib:hello.lib

/out:hello.dll

JavaNativeImp.obj

Creating library hello.lib and object hello.exp

結果運行的時候報錯;

出錯3:

D:\Java\gitworkspace\Coding\bin>java com.stono.jvm.JavaNative

Exception in thread "main" java.lang.UnsatisfiedLinkError: D:\Java\gitworkspace\

Coding\bin\hello.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

at java.lang.ClassLoader$NativeLibrary.load(Native Method)

at java.lang.ClassLoader.loadLibrary0(Unknown Source)

at java.lang.ClassLoader.loadLibrary(Unknown Source)

at java.lang.Runtime.loadLibrary0(Unknown Source)

at java.lang.System.loadLibrary(Unknown Source)

at com.stono.jvm.JavaNative.(JavaNative.java:6)

因為在Eclipse中使用了64位的java,dll使用的是32位的;

學習了:https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform 只能把Java改成32位了;因為C語言64不熟悉;

重新用EditPlus寫了Java文件,用32位jdk編譯;

運行的時候報錯,

出錯4:

D:\>d:\java\jdk1.6.0_12\bin\java.exe JavaNative

Exception in thread "main" java.lang.UnsatisfiedLinkError: JavaNative.hello(Ljav

a/lang/String;)V

at JavaNative.hello(Native Method)

at JavaNative.main(JavaNative.java:7)

最開始以為是dll文件是原來的java程序生成的,就又重頭跑了一遍;就是先javah -jni xxx,然后寫c文件,然后cl編譯;

結果還是出錯4;

學習了:https://www.cnblogs.com/cuglkb/p/5665882.html 這個方法沒有測試;

http://blog.csdn.net/missingu1314/article/details/12650725 用的是這個方法;

主要是因為在dll中,可能xxx.h頭文件中的接口名和xxx.cpp源文件中的實現函數名不一致導致的。

源碼:

/*DO NOT EDIT THIS FILE - it is machine generated*/#include

/*Header for class JavaNative*/#ifndef _Included_JavaNative#define _Included_JavaNative#ifdef __cplusplusextern "C"{#endif

/** Class: JavaNative

* Method: hello

* Signature: (Ljava/lang/String;)V*/JNIEXPORTvoidJNICALL Java_JavaNative_hello

(JNIEnv*, jobject, jstring);

#ifdef __cplusplus

}#endif

#endif

#include #include"JavaNative.h"#includeJNIEXPORTvoid JNICALL Java_JavaNative_hello(JNIEnv *env,jobject obj, jstring name){const char *str;

str= (*env)->GetStringUTFChars(env, name, NULL);if (str ==NULL) {return;

}

printf("Hello World! %s \n", str );return;

}

C文件可以隨便起名,但是方法必須和接口中的名字一樣;

然后就又是cl編譯,然后java JavaNative就可以了;

Java源碼:

public classJavaNative {public native voidhello(String name);static{

System.loadLibrary("hello");

}public static voidmain(String[] args) {new JavaNative().hello("jni");

}

}

總結

以上是生活随笔為你收集整理的java+构造函数+native_java中native的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。