最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

  • javah工具的用法
  • 按照C/C++頭文件來編寫C/C++源文件
  • 將C/C++源文件編譯成動態(tài)連接庫(DLL)
  • 在Java程序中引入動態(tài)連接庫等知識

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

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

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

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

  

筆者創(chuàng)建了一個命為:TestNativeCode的項目,新建包名為com.wwj.nativecode,新建類為TestNativeCode

接著在TestNativeCode類當中聲明我們的本地方法:

package com.wwj.nativecode; 
 
public class TestNativeCode { 
  // 聲明本地方法 
  public native void sayHello(); 
  public static void main(String[] args) { 
//   // 加載動態(tài)鏈接庫 
//   System.loadLibrary("nativeCode"); 
//   TestNativeCode nativeCode = new TestNativeCode(); 
//   nativeCode.sayHello(); 
 
  } 
} 

注釋掉的代碼后面很快會用到,暫時不用管。

我們聲明了本地方法之后,就可以用jdk中javah命令來為我們生成對應(yīng)的頭文件,在命令可以敲入javah -help:

會顯示出javah命令的一些使用參數(shù)和意義。

找到我們Java項目TestNativeCode的路徑:筆者這里是D:\workspace\TestNativeCode

我們進入bin目錄,就可以找到對應(yīng)的字節(jié)碼文件:

我們用這個來生成我們所需要的.h文件:

格式為:javah 包名.文件名

生成成功后,我們可以在當前路徑下生成的.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)建一個win32控制臺應(yīng)用程序,取名為nativeCode:


創(chuàng)建成功后,將我們生成的頭文件剪切到C++項目中,并在項目中引入:


新建源文件:source.cpp

根據(jù)頭文件來編寫源文件:

我們發(fā)現(xiàn)代碼中有錯,原因是我們沒有引入“jni.h"頭文件,jni.h頭文件是在我們的jdk目錄下,include文件夾下:

把jni.h復(fù)制到項目中去,運行項目發(fā)現(xiàn)如下錯誤:

1>------ 已啟動生成: 項目: nativeCode, 配置: Debug Win32 ------

1>  source.cpp

1>c:\users\administrator\documents\visual studio 2012\projects\nativecode\nativecode\jni.h(45): fatal error C1083: 無法打開包括文件:“jni_md.h”: No such file or directory

========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========

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

同樣把它添加到項目中去:

現(xiàn)在代碼已經(jīng)沒有錯誤提示了,運行成功之后會生成我們需要的DLL文件,在對應(yīng)的Debug目錄下可以找到:

接著把這個動態(tài)庫添加到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) { 
    // 加載動態(tài)鏈接庫 
    System.loadLibrary("nativeCode"); 
    TestNativeCode nativeCode = new TestNativeCode(); 
    nativeCode.sayHello(); 
 
  } 
} 

運行java項目,如果聲明了環(huán)境變量之后,沒有重啟Eclipse會報這樣的錯:

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

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

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

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

我們創(chuàng)建的VS項目,是Win32的平臺,而小巫的操作系統(tǒng)是64位的,所以我在Eclipse加載鏈接庫的時候會報錯。那么如何來解決這個問題呢,我們需要配置VS編譯的平臺,我們需要配置為x64位。

配置完之后,重新編譯運行,在項目根目錄會生成x64的目錄

然后我們把使用x64平臺生成的動態(tài)鏈接庫配置到環(huán)境變量中去:

我的路徑是:C:\Users\Administrator\Documents\visual studio 2012\Projects\nativeCode\x64\Debug

接著我們重啟Eclipse,運行我們的測試項目,這個時候就沒有錯誤了。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java設(shè)計模式之java解釋器模式詳解

    Java設(shè)計模式之java解釋器模式詳解

    這篇文章主要介紹了Java設(shè)計模式之解釋器模式定義與用法,結(jié)合具體實例形式詳細分析了Java解釋器模式的概念、原理、定義及相關(guān)操作技巧,需要的朋友可以參考下
    2021-09-09
  • SpringBoot中整合knife4j接口文檔的實踐

    SpringBoot中整合knife4j接口文檔的實踐

    這篇文章主要介紹了SpringBoot中整合knife4j接口文檔的實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • SpringBoot向resources下寫文件的兩種方式

    SpringBoot向resources下寫文件的兩種方式

    這篇文章給大家分享了兩種SpringBoot向resources下寫文件的方式,每種方式都有詳細的代碼示例,對我們的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-08-08
  • Spring Boot + Vue 基于 RSA 的用戶身份認證加密機制實現(xiàn)過程

    Spring Boot + Vue 基于 RSA 的用戶身份

    RSA是一種非對稱加密算法,適用于用戶身份認證加密,本文介紹了基于RSA的用戶身份認證加密機制的實現(xiàn),包括前端Vue.js使用jsencrypt庫對用戶名密碼進行加密,后端使用RSA私鑰解密驗證用戶憑據(jù),感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Mybatis Generator最完美配置文件詳解(完整版)

    Mybatis Generator最完美配置文件詳解(完整版)

    今天小編給大家整理了一篇關(guān)于Mybatis Generator最完美配置文件詳解教程,非常不錯具有參考借鑒價值,感興趣的朋友一起學習吧
    2016-11-11
  • Java8實現(xiàn)Stream流的合并的方法展示

    Java8實現(xiàn)Stream流的合并的方法展示

    本文介紹了Java8中Stream流的合并方法,包括concat()、flatMap()和reduce()三種方法。其中,concat()方法可以將兩個Stream流合并成一個,flatMap()方法可以將一個Stream流中的元素映射成多個Stream流并合并成一個,reduce()方法可以將Stream流中的元素逐個合并成一個結(jié)果
    2023-05-05
  • JSch教程使用sftp協(xié)議實現(xiàn)服務(wù)器文件載操作

    JSch教程使用sftp協(xié)議實現(xiàn)服務(wù)器文件載操作

    這篇文章主要為大家介紹了JSch如何使用sftp協(xié)議實現(xiàn)服務(wù)器文件上傳下載操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • mybatis接收以逗號分隔的字符串批量查詢方式

    mybatis接收以逗號分隔的字符串批量查詢方式

    這篇文章主要介紹了mybatis接收以逗號分隔的字符串批量查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 解析Oracle數(shù)據(jù)庫中的對象集合schema

    解析Oracle數(shù)據(jù)庫中的對象集合schema

    這篇文章主要介紹了Oracle數(shù)據(jù)庫中的對象集合schema,是Oracle數(shù)據(jù)庫入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Mybatis插件PageHelper的實現(xiàn)原理詳解

    Mybatis插件PageHelper的實現(xiàn)原理詳解

    PageHelper 是一款開源的 MyBatis 分頁插件,可以在實際應(yīng)用中方便地實現(xiàn)分頁功能,這篇文章主要來和大家講講PageHelper的原理與使用,需要的可以參考下
    2023-06-06

最新評論

南安市| 鸡西市| 会东县| 南投市| 台北县| 夹江县| 观塘区| 浦县| 额敏县| 苍山县| 武安市| 廊坊市| 九寨沟县| 正镶白旗| 张家港市| 镇康县| 南靖县| 镇沅| 江口县| 潢川县| 巫山县| 武邑县| 怀仁县| 义乌市| 缙云县| 汪清县| 无为县| 华池县| 宣汉县| 莱州市| 大安市| 孝感市| 吉首市| 隆回县| 沅陵县| 沈阳市| 左贡县| 梓潼县| 临海市| 龙南县| 鹤山市|