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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。