java+构造函数+native_java中native的用法
public static native void ?java.lang.System.arraycopy(Object, int, Object, int, int)方法竟然是native的,
查詢了一下java中native的用法,找到如下文章,
學(xué)習(xí)了:https://www.cnblogs.com/b3051/p/7484501.html
但是,自己手癢,寫了一下,結(jié)果,填了幾個(gè)坑;
1,javah 之前沒有使用過,用起來還算可以,中規(guī)中矩;
2,編寫C文件也還可以;隨便寫,結(jié)果就挖了一個(gè)坑;
3,使用cl編譯有些問題,有些文章說要安裝Visio Studio 20XX,
學(xué)習(xí)了:http://blog.163.com/yuyang_tech/blog/static/2160500832013118112049372/
決定使用vc6.0來做,
下載地址:http://www.pc6.com/softview/SoftView_51072.html
解壓至D:\pvc6\VC98\BIN,在添加到系統(tǒng)path中;
后來發(fā)現(xiàn)我把D:\pvc6\COMMON\MSDEV98\BIN;D:\pvc6\VC98\INCLUDE也加到路徑里面了;忘記為啥了;
出錯(cuò)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參數(shù),
CL.EXE -I%java_home%\include -I%java_home%\include\win32 -ID:\pvc6\VC98\INCLUDE -LD JavaNativeImp.c -Fehello.dll
出錯(cuò)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"
找不到參數(shù)可以加lib了,
學(xué)習(xí)了:http://blog.csdn.net/cruise_h/article/details/29218407
在我的電腦->屬性->高級(jí)系統(tǒng)設(shè)置->環(huán)境變量->系統(tǒng)變量中新建系統(tǒng)變量LIB、INCLUDE并設(shè)置它們的值為:
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
結(jié)果運(yùn)行的時(shí)候報(bào)錯(cuò);
出錯(cuò)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)
因?yàn)樵贓clipse中使用了64位的java,dll使用的是32位的;
學(xué)習(xí)了:https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform 只能把Java改成32位了;因?yàn)镃語言64不熟悉;
重新用EditPlus寫了Java文件,用32位jdk編譯;
運(yùn)行的時(shí)候報(bào)錯(cuò),
出錯(cuò)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編譯;
結(jié)果還是出錯(cuò)4;
學(xué)習(xí)了:https://www.cnblogs.com/cuglkb/p/5665882.html 這個(gè)方法沒有測試;
http://blog.csdn.net/missingu1314/article/details/12650725 用的是這個(gè)方法;
主要是因?yàn)樵赿ll中,可能xxx.h頭文件中的接口名和xxx.cpp源文件中的實(shí)現(xiàn)函數(shù)名不一致導(dǎo)致的。
源碼:
/*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");
}
}
總結(jié)
以上是生活随笔為你收集整理的java+构造函数+native_java中native的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [react] 怎样在react中使用i
- 下一篇: H5开发,打包成APK