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的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [react] 怎样在react中使用i
- 下一篇: 乌班图系统16.04安装