JNI,是Java Native Interface的簡(jiǎn)稱,中文是“Java本地調(diào)用”。通過這種技術(shù)可以做到以下兩點(diǎn):
專注于為中小企業(yè)提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)鐵門關(guān)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
本篇博客帶給童鞋們以下內(nèi)容,學(xué)習(xí)內(nèi)容來(lái)自(傳智播客),經(jīng)由小巫總結(jié)整理:
JNI并不是什么特別神奇的東西,當(dāng)初SUN推出它的目的是為了屏蔽不同操作系統(tǒng)平臺(tái)的差異性,通過Java語(yǔ)言來(lái)調(diào)用Native語(yǔ)言的功能模塊,避免重復(fù)制作車輪,最主要是這兩個(gè)目的。
最簡(jiǎn)單的Java調(diào)用C/C++代碼,有以下步驟,童鞋們最好詳細(xì)閱讀,避免出現(xiàn)相應(yīng)的錯(cuò)誤:
我們現(xiàn)在一步一步把整個(gè)流程熟悉一遍,在Eclipse中創(chuàng)建一個(gè)Java項(xiàng)目:
筆者創(chuàng)建了一個(gè)命為:TestNativeCode的項(xiàng)目,新建包名為com.wwj.nativecode,新建類為TestNativeCode
接著在TestNativeCode類當(dāng)中聲明我們的本地方法:
package com.wwj.nativecode; public class TestNativeCode { // 聲明本地方法 public native void sayHello(); public static void main(String[] args) { // // 加載動(dòng)態(tài)鏈接庫(kù) // System.loadLibrary("nativeCode"); // TestNativeCode nativeCode = new TestNativeCode(); // nativeCode.sayHello(); } }
注釋掉的代碼后面很快會(huì)用到,暫時(shí)不用管。
我們聲明了本地方法之后,就可以用jdk中javah命令來(lái)為我們生成對(duì)應(yīng)的頭文件,在命令可以敲入javah -help:
會(huì)顯示出javah命令的一些使用參數(shù)和意義。
找到我們Java項(xiàng)目TestNativeCode的路徑:筆者這里是D:\workspace\TestNativeCode
我們進(jìn)入bin目錄,就可以找到對(duì)應(yīng)的字節(jié)碼文件:
我們用這個(gè)來(lái)生成我們所需要的.h文件:
格式為:javah 包名.文件名
生成成功后,我們可以在當(dāng)前路徑下生成的.h文件:
以上的步驟已經(jīng)很清楚的介紹如何使用javah命令生成native頭文件。受用編輯器打開頭文件,有以下代碼:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_wwj_nativecode_TestNativeCode */ #ifndef _Included_com_wwj_nativecode_TestNativeCode #define _Included_com_wwj_nativecode_TestNativeCode #ifdef __cplusplus extern "C" { #endif /* * Class: com_wwj_nativecode_TestNativeCode * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_com_wwj_nativecode_TestNativeCode_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
接著在Visual studio中創(chuàng)建一個(gè)win32控制臺(tái)應(yīng)用程序,取名為nativeCode:
創(chuàng)建成功后,將我們生成的頭文件剪切到C++項(xiàng)目中,并在項(xiàng)目中引入:
新建源文件:source.cpp
根據(jù)頭文件來(lái)編寫源文件:
我們發(fā)現(xiàn)代碼中有錯(cuò),原因是我們沒有引入“jni.h"頭文件,jni.h頭文件是在我們的jdk目錄下,include文件夾下:
把jni.h復(fù)制到項(xiàng)目中去,運(yùn)行項(xiàng)目發(fā)現(xiàn)如下錯(cuò)誤:
1>------ 已啟動(dòng)生成: 項(xiàng)目: nativeCode, 配置: Debug Win32 ------
1> source.cpp
1>c:\users\administrator\documents\visual studio 2012\projects\nativecode\nativecode\jni.h(45): fatal error C1083: 無(wú)法打開包括文件:“jni_md.h”: No such file or directory
========== 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過 0 個(gè) ==========
還是缺少頭文件了,jni_md.h也是在jdk中:
同樣把它添加到項(xiàng)目中去:
現(xiàn)在代碼已經(jīng)沒有錯(cuò)誤提示了,運(yùn)行成功之后會(huì)生成我們需要的DLL文件,在對(duì)應(yīng)的Debug目錄下可以找到:
接著把這個(gè)動(dòng)態(tài)庫(kù)添加到PATH環(huán)境變量中去,筆者的路徑為(C:\Users\Administrator\Documents\visual studio 2012\Projects\nativeCode\Debug):
最后在Eclipse中使用Java調(diào)用我們的Native代碼:
package com.wwj.nativecode; public class TestNativeCode { // 聲明本地方法 public native void sayHello(); public static void main(String[] args) { // 加載動(dòng)態(tài)鏈接庫(kù) System.loadLibrary("nativeCode"); TestNativeCode nativeCode = new TestNativeCode(); nativeCode.sayHello(); } }
運(yùn)行java項(xiàng)目,如果聲明了環(huán)境變量之后,沒有重啟Eclipse會(huì)報(bào)這樣的錯(cuò):
這時(shí)我們重啟一下Eclipse讓環(huán)境變量生效即可。
但最后調(diào)用的時(shí)候出現(xiàn)了這個(gè)錯(cuò)誤,小巫暫未解決:
望路過的大神,給你解決方案,動(dòng)態(tài)庫(kù)是加載成功了,但調(diào)用方法是時(shí)候出現(xiàn)錯(cuò)誤了。
很抱歉隔了這么久才來(lái)更新這篇博客,小巫之前的這個(gè)錯(cuò)誤已經(jīng)解決掉了,為什么會(huì)出現(xiàn)鏈接錯(cuò)誤呢,主要還是鏈接庫(kù)的問題。
我們創(chuàng)建的VS項(xiàng)目,是Win32的平臺(tái),而小巫的操作系統(tǒng)是64位的,所以我在Eclipse加載鏈接庫(kù)的時(shí)候會(huì)報(bào)錯(cuò)。那么如何來(lái)解決這個(gè)問題呢,我們需要配置VS編譯的平臺(tái),我們需要配置為x64位。
配置完之后,重新編譯運(yùn)行,在項(xiàng)目根目錄會(huì)生成x64的目錄
然后我們把使用x64平臺(tái)生成的動(dòng)態(tài)鏈接庫(kù)配置到環(huán)境變量中去:
我的路徑是:C:\Users\Administrator\Documents\visual studio 2012\Projects\nativeCode\x64\Debug
接著我們重啟Eclipse,運(yùn)行我們的測(cè)試項(xiàng)目,這個(gè)時(shí)候就沒有錯(cuò)誤了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
當(dāng)前題目:JNI實(shí)現(xiàn)最簡(jiǎn)單的JAVA調(diào)用C/C++代碼
文章源于:http://jinyejixie.com/article2/pgegoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站收錄、建站公司、、標(biāo)簽優(yōu)化、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)