欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JNI實(shí)現(xiàn)最簡(jiǎn)單的JAVA調(diào)用C/C++代碼

 更新時(shí)間:2017年08月02日 14:55:18   作者:IT_xiao小巫  
這篇文章主要介紹了JNI實(shí)現(xiàn)最簡(jiǎn)單的JAVA調(diào)用C/C++代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

JNI,是Java Native Interface的簡(jiǎn)稱(chēng),中文是“Java本地調(diào)用”。通過(guò)這種技術(shù)可以做到以下兩點(diǎn):

  1. Java程序中的函數(shù)可以調(diào)用Native語(yǔ)言寫(xiě)的函數(shù),Native一般指的是C/C++編寫(xiě)的函數(shù)。
  2. Native程序中的函數(shù)可以調(diào)用Java層的函數(shù),也就是說(shuō)在C/C++程序中可以調(diào)用Java的函數(shù)。

本篇博客帶給童鞋們以下內(nèi)容,學(xué)習(xí)內(nèi)容來(lái)自(傳智播客),經(jīng)由小巫總結(jié)整理:

  • javah工具的用法
  • 按照C/C++頭文件來(lái)編寫(xiě)C/C++源文件
  • 將C/C++源文件編譯成動(dòng)態(tài)連接庫(kù)(DLL)
  • 在Java程序中引入動(dòng)態(tài)連接庫(kù)等知識(shí)

JNI并不是什么特別神奇的東西,當(dāng)初SUN推出它的目的是為了屏蔽不同操作系統(tǒng)平臺(tái)的差異性,通過(guò)Java語(yǔ)言來(lái)調(diào)用Native語(yǔ)言的功能模塊,避免重復(fù)制作車(chē)輪,最主要是這兩個(gè)目的。

最簡(jiǎn)單的Java調(diào)用C/C++代碼,有以下步驟,童鞋們最好詳細(xì)閱讀,避免出現(xiàn)相應(yīng)的錯(cuò)誤:

  • 首先在Java類(lèi)中聲明一個(gè)native的方法
  • 使用Javah命令生成native方法的聲明的C/C++頭文件
  • 按照生成的C/C++頭文件來(lái)編寫(xiě)C/C++源文件
  • 將C/C++源文件編譯成動(dòng)態(tài)鏈接庫(kù)(DLL)
  • 將DLL文件加入到PATH環(huán)境變量下
  • Java類(lèi)中加載DLL,然后調(diào)用聲明方法

我們現(xiàn)在一步一步把整個(gè)流程熟悉一遍,在Eclipse中創(chuàng)建一個(gè)Java項(xiàng)目:

  

筆者創(chuàng)建了一個(gè)命為:TestNativeCode的項(xiàng)目,新建包名為com.wwj.nativecode,新建類(lèi)為T(mén)estNativeCode

接著在TestNativeCode類(lèi)當(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頭文件。受用編輯器打開(kāi)頭文件,有以下代碼:

/* 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)編寫(xiě)源文件:

我們發(fā)現(xiàn)代碼中有錯(cuò),原因是我們沒(méi)有引入“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ú)法打開(kāi)包括文件:“jni_md.h”: No such file or directory

========== 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過(guò) 0 個(gè) ==========

還是缺少頭文件了,jni_md.h也是在jdk中:

同樣把它添加到項(xiàng)目中去:

現(xiàn)在代碼已經(jīng)沒(méi)有錯(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)境變量之后,沒(méi)有重啟Eclipse會(huì)報(bào)這樣的錯(cuò):

這時(shí)我們重啟一下Eclipse讓環(huán)境變量生效即可。

但最后調(diào)用的時(shí)候出現(xiàn)了這個(gè)錯(cuò)誤,小巫暫未解決:

望路過(guò)的大神,給你解決方案,動(dòng)態(tài)庫(kù)是加載成功了,但調(diào)用方法是時(shí)候出現(xiàn)錯(cuò)誤了。

很抱歉隔了這么久才來(lái)更新這篇博客,小巫之前的這個(gè)錯(cuò)誤已經(jīng)解決掉了,為什么會(huì)出現(xiàn)鏈接錯(cuò)誤呢,主要還是鏈接庫(kù)的問(wèn)題。

我們創(chuàng)建的VS項(xiàng)目,是Win32的平臺(tái),而小巫的操作系統(tǒng)是64位的,所以我在Eclipse加載鏈接庫(kù)的時(shí)候會(huì)報(bào)錯(cuò)。那么如何來(lái)解決這個(gè)問(wèn)題呢,我們需要配置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í)候就沒(méi)有錯(cuò)誤了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java算法之重新排列數(shù)組例題

    Java算法之重新排列數(shù)組例題

    這篇文章主要介紹了Java算法之重新排列數(shù)組例題,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-08-08
  • Spring Cloud構(gòu)建Eureka應(yīng)用的方法

    Spring Cloud構(gòu)建Eureka應(yīng)用的方法

    這篇文章主要介紹了Spring Cloud構(gòu)建Eureka應(yīng)用的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 詳解JNI到底是什么

    詳解JNI到底是什么

    JNI是Java Native Interface的縮寫(xiě),通過(guò)使用 Java本地接口書(shū)寫(xiě)程序,可以確保代碼在不同的平臺(tái)上方便移植。從Java1.1開(kāi)始,JNI標(biāo)準(zhǔn)成為java平臺(tái)的一部分,它允許Java代碼和其他語(yǔ)言寫(xiě)的代碼進(jìn)行交互
    2021-06-06
  • SpringBoot整合PageHelper實(shí)現(xiàn)分頁(yè)查詢功能詳解

    SpringBoot整合PageHelper實(shí)現(xiàn)分頁(yè)查詢功能詳解

    PageHelper是mybatis框架的一個(gè)插件,用于支持在mybatis執(zhí)行分頁(yè)操作。本文將通過(guò)SpringBoot整合PageHelper實(shí)現(xiàn)分頁(yè)查詢功能,需要的可以參考一下
    2022-03-03
  • 詳解Spring關(guān)于@Resource注入為null解決辦法

    詳解Spring關(guān)于@Resource注入為null解決辦法

    這篇文章主要介紹了詳解Spring關(guān)于@Resource注入為null解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • MyBatis中SqlSession實(shí)現(xiàn)增刪改查案例

    MyBatis中SqlSession實(shí)現(xiàn)增刪改查案例

    這篇文章主要介紹了MyBatis中SqlSession實(shí)現(xiàn)增刪改查案例,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • SpringBoot使用編程方式配置DataSource的方法

    SpringBoot使用編程方式配置DataSource的方法

    這篇文章主要介紹了SpringBoot使用編程方式配置DataSource的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Mybatis核心配置文件、默認(rèn)類(lèi)型別名、Mybatis獲取參數(shù)值的兩種方式(實(shí)例代碼)

    Mybatis核心配置文件、默認(rèn)類(lèi)型別名、Mybatis獲取參數(shù)值的兩種方式(實(shí)例代碼)

    這篇文章主要介紹了Mybatis核心配置文件、默認(rèn)類(lèi)型別名、Mybatis獲取參數(shù)值的兩種方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • idea +junit單元測(cè)試獲取不到bean注入的解決方式

    idea +junit單元測(cè)試獲取不到bean注入的解決方式

    這篇文章主要介紹了idea +junit單元測(cè)試獲取不到bean注入的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 在Java項(xiàng)目中實(shí)現(xiàn)CI/CD持續(xù)集成與持續(xù)部署

    在Java項(xiàng)目中實(shí)現(xiàn)CI/CD持續(xù)集成與持續(xù)部署

    這篇文章主要為大家介紹了在Java項(xiàng)目中實(shí)現(xiàn)CI/CD持續(xù)集成與持續(xù)部署詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評(píng)論