初探JNI技術,HelloWorld 圖文詳細教程
1、什麼是JNI?
一種讓Java呼叫其他語言的技術。
本博文將會介紹JNI 呼叫C++的技術。
博文的結尾有關於此教程的所有程式碼的免積分下載。
2、JNI 之 HelloWorld in JAVA
HelloWorld.java:
package com.hello; public class HelloWorld { public native void hello(String name); public HelloWorld(){ } static { System.loadLibrary( "HelloWorld" ); } }
注意下,如果我們用JNI編出的檔案叫: HelloWorld.dll ,那麼System.loadLibrary("HelloWorld"),不用加“.dll”。
TestHelloWorld.java:
package com.hello; public class TestHelloWorld { public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.hello("emaster"); } }
編譯一下,生成兩個class檔案。
至此,java方面的程式碼就完事了。3、JNI 之 HelloWorld in C++ 選擇IDE
在開始之前,我推薦大家用VC++6.0,而不是CodeBlocks來編寫C++方面的程式碼!
理由如下:
這是CodeBlocks生成的DLL的匯出函式:
_Z44[email protected]8
這是VC生成的DLL的匯出函式:
[email protected]
發現沒有?CB生成的DLL匯出函式多了一些:_Z44啊,P7JNIEnv_P8_jobject之類的。
匯出函式多一些東西之後,會導致我們在Java中找不到對應的函式。
哎,也可能是我 CB沒有調整好編譯命令吧。總之我在VC下成功了。
Ps:
4、javah生成C++用的標頭檔案
我的工作目錄如下:
D:\pub\workspace\JNIHelloWorld\src\com\hello 的目錄
2014-05-14 18:04 <DIR> .
2014-05-14 18:04 <DIR> ..
2014-05-14 18:04 218 HelloWorld.java
2014-05-14 18:04 207 TestHelloWorld.java
在com.hello下有上面提到的兩個java檔案。(請注意,之前已經編譯過java檔案,所以bin資料夾下有類檔案!)
請注意我生成標頭檔案的目錄和命令:
D:\pub\workspace\JNIHelloWorld\bin>javah com.hello.HelloWorld
D:\pub\workspace\JNIHelloWorld\bin>dir
2014-05-14 18:21 <DIR> .
2014-05-14 18:21 <DIR> ..
2014-05-14 18:04 <DIR> com
2014-05-14 18:21 475 com_hello_HelloWorld.h
看到沒有,生成了一個頭檔案:com_hello_HelloWorld.h。
如果目錄不對,很可能報錯如下:
錯誤:無法訪問 HelloWorld
錯誤的類檔案: D:\pub\workspace\JNIHelloWorld\bin\com\hello\HelloWorld.class
類檔案包含錯誤的類: com.hello.HelloWorld
請刪除該檔案或確保該檔案位於正確的類路徑子目錄中。
com.sun.tools.javac.util.Abort
at com.sun.tools.javac.comp.Check.completionError(Check.java:162)
at com.sun.tools.javadoc.DocEnv.loadClass(DocEnv.java:147)
at com.sun.tools.javadoc.RootDocImpl.<init>(RootDocImpl.java:77)
at com.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:159
)
at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:330)
at com.sun.tools.javadoc.Start.begin(Start.java:128)
at com.sun.tools.javadoc.Main.execute(Main.java:66)
at com.sun.tools.javah.Main.main(Main.java:147)
javadoc: 錯誤 - 致命錯誤
2 錯誤
5、JNI 之 HelloWorld in C++ 詳細步驟
5.1、步驟1
VC新建專案,選擇Win32 Dynamic-Link Library專案(生成DLL的),預設即可。
我的專案名字為:JNIHelloWorld。
5.2、步驟2
把第4步的標頭檔案:com_hello_HelloWorld.h 放到VC中。
5.3、步驟3
修改下輸出DLL的名字:VC選單 -> 工程 -> 設定 -> 連線 -> 輸出檔名 這一欄,改成:Debug/HelloWorld.dll
這樣子就和Java程式碼中的dll名字一樣了,其實可以手動F2修改的,這裡設定後就不能每次都去修改了,懶人。
5.4、步驟4
把HelloWorld.dll放到Java專案的根目錄下,我這裡是根目錄是:
D:\pub\workspace\JNIHelloWorld
所以該dll的路徑是:
D:\pub\workspace\JNIHelloWorld\HelloWorld.dll
5.5、步驟5
配置jni標頭檔案,不然C++會報錯找不到該標頭檔案:
就是到jdk的安裝目錄下include下把以下相應的檔案,複製到vc目錄下的include資料夾下:
\jdk\include\jni.h
\jdk\include\win32\jawt_md.h
\jdk\include\win32\jni_md.h
上面主是jdk安裝目錄下的三個檔案,分別複製它們到vc目錄下的include資料夾下。如我的安裝位置是:
D:\Program Files\Microsoft Visual Studio\VC98\Include
你們可以根據自己的安裝位置自行確定。5.6、步驟6
程式碼如下:
com_hello_HelloWorld.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hello_HelloWorld */
#ifndef _Included_com_hello_HelloWorld
#define _Included_com_hello_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hello_HelloWorld
* Method: hello
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_hello_HelloWorld_hello
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
JNIHelloWorld.cpp:
// JNIHelloWorld.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "com_hello_HelloWorld.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
JNIEXPORT void JNICALL Java_com_hello_HelloWorld_hello
(JNIEnv *, jobject, jstring)
{
printf("I am in C++!\n");
return;
}
6、效果如下:
可以看到,我們在Java中,呼叫C++的方法成功!
至此,一個完整的HelloWorld版本的JNI過程,就完成了。
7、程式碼下載
emaster 關注資訊保安的胖子
相關推薦
初探JNI技術,HelloWorld 圖文詳細教程
1、什麼是JNI? 一種讓Java呼叫其他語言的技術。 本博文將會介紹JNI 呼叫C++的技術。 博文的結尾有關於此教程的所有程式碼的免積分下載。 2、JNI 之 HelloWorld in JAVA HelloWorld.java: package com.hel
【Oracle 叢集】ORACLE DATABASE 11G RAC 知識圖文詳細教程之快取融合技術和主要後臺程序(四)
前面已經介紹了 RAC 的後臺程序,為了更深入的瞭解這些後臺程序的工作原理,先了解一下 RAC 中多節點對共享資料檔案訪問的管理是如何進行的。要了解 RAC 工作原理的中心,需要知道 Cache Fusion 這個重要的概念,要發揮 Cache Fusion 的作用,要有一個前提條件,那就
【新手教程】手把手教你搭建騰訊雲伺服器,圖文詳細教程
· 背景 暑假期間,愁著無聊但也不能荒廢學業吧,畢竟以後想靠技術混口飯吃!為了實施自己的計劃,特地挑了一個便宜的雲伺服器來用作自己的後臺;這不是學生狗沒錢嘛,所以我就挑了一個騰訊雲伺服器。雖說配置很低,但夠我們玩就行。因為想寫一個電商App,資料總不能從本地資料
apache ab壓測快速使用(天下沒有難學的技術,只有LJ的教程)
cmd命令 單位 color 結果 返回 window 常用 教程 apach 目錄(沒有你想要的直接掠過,這裏以window為例) 如何下載ab 如何使用ab ab常用參數介紹 ab壓測遇到坑看這裏 一、如何下載ab 1.從官網下載(htt
新手入門,webpack入門詳細教程
第一步,要使用webpack,首先要安裝node.js,https://nodejs.org/en/ 官網直接下載即可,具體安裝教程,可以參考菜鳥教程 https://www.runoob.com/nodejs/nodejs-install-setup.html 第二步,在本地新建一個工
JDK的下載、安裝、配置及校驗 — 全程圖文詳細教程
JDK的下載、安裝、配置及校驗 — 全程圖文詳細教程 JAVA的學習和開發,必須安裝配置好JDK(java development kit java開發工具包)。Java的開發平臺主要分2類:Java SE是標準版,Java應用程式開發 Application;Java EE是企業版
技術胖TypeScript圖文視訊教程
近日Node.js之父瑞安達爾(Ryan Dahl)釋出新的開源專案 deno,從官方介紹來看,可以認為它是下一代 Node,使用 Go 語言代替 C++ 重新編寫跨平臺底層核心驅動,上層仍然使用 V8 引擎,最終提供一個安全的 TypeScript 執行時。
【Oracle 叢集】11G RAC 知識圖文詳細教程之RAC在LINUX上使用NFS安裝前準備(六)
目錄 介紹 下載軟體 本文使用Oracle Enterprise Linux 5.7。 一般的圖形作業系統安裝指南在這裡。 更具體地說,它應該是一個伺服器安裝的2 g交換(最好是3-4G),Li
Virtualbox虛擬機器安裝CentOS 6.5圖文詳細教程
什麼是Virtualbox? VirtualBox 是一款開源虛擬機器軟體(注:跟vmware差不多)。VirtualBox 是由德國 Innotek 公司開發,由Sun Microsystems公司出品的軟體,使用Qt編寫,在 Sun 被 Oracle 收購後正式
Oracle 叢集】ORACLE DATABASE 11G RAC 知識圖文詳細教程之ORACLE叢集概念和原理(二)
概述:寫下本文件的初衷和動力,來源於上篇的《oracle基本操作手冊》。oracle基本操作手冊是作者研一假期對oracle基礎知識學習的彙總。然後形成體系的總結,一則進行回顧複習,另則便於查詢使用。本圖文文件亦源於此。閱讀Oracle RAC安裝與使用教程前,筆者先對這篇文章整體構思和形成進行梳理。
【Oracle 叢集】ORACLE DATABASE 11G RAC 知識圖文詳細教程之RAC 特殊問題和實戰經驗(五)
在需要將一個 LUN (邏輯單元號)對映給多個節點、為叢集提供一個共享的儲存卷時,同一個儲存 LUN 在各個主機端的 LUNID 必須是相同的。比如: (一) 在為多個 ESX 節點建立一個 VMFS 卷的時候 (二) 在雙機 HA 叢集建立共享儲存的時候 時間一致性 叢集模式下,各
【Oracle 叢集】ORACLE DATABASE 11G RAC 知識圖文詳細教程之RAC 工作原理和相關元件(三)
概述:寫下本文件的初衷和動力,來源於上篇的《oracle基本操作手冊》。oracle基本操作手冊是作者研一假期對oracle基礎知識學習的彙總。然後形成體系的總結,一則進行回顧複習,另則便於查詢使用。本圖文文件亦源於此。閱讀Oracle RAC安裝與使用教程前,筆者先對這篇文章整體構思和形成進行梳理。
【Oracle 叢集】ORACLE DATABASE 11G RAC 知識圖文詳細教程之叢集概念介紹(一)
白寧超 2015年7月16日 概述:寫下本文件的初衷和動力,來源於上篇的《oracle基本操作手冊》。oracle基本操作手冊是作者研一假期對oracle基礎知識學習的彙總。然後形成體系的總結,一則進行回顧複習,另則便於查詢使用。本圖文文件亦源於此。閱讀Oracle RAC安裝與使用教程前,筆者先
Ubuntu16.04使用Anaconda5搭建TensorFlow使用環境 圖文詳細教程
說明 - Ubuntu版本16.04 LTS - Anaconda版本 5.0.1 (對應Python 3.6.3) - Tensorflow 1.3.0(由Anaconda提供,你也可以選擇其他版本,包括GPU的) Anaconda指的是一個開
TC Games無需安卓模擬器電腦玩絕地求生手遊,按鍵設定詳細教程
tcgames無需安卓模擬器電腦玩刺激戰場和全軍出擊遊戲按鍵怎麼設定?最近很多吃雞玩家在操作絕地求生:刺激戰場和絕地求生:全軍出擊的時候發現了,用模擬器在電腦上玩的話只能跟模擬器玩家匹配,而用tcgames電腦玩手遊助手可以跟手遊服玩家匹配。部分玩家在使用tcgames電腦玩
linux(ubuntu16.04)如何開啟圖片圖文詳細教程
圖片工具linux(ubuntu16.04)如下:eog (eye of gmone,是linux下內建的圖片檢視器。ubuntu16.04)fbi (ubuntu16.04下需安裝:apt install fbi)fibda使用方法在圖片檔案目錄中使用eog,例如root目
Android 開發之Windows環境下Android Studio安裝和使用教程(圖文詳細步驟)
9.png 虛擬機 jdk版本 編寫 clip 開發平臺 集成開發 arc 電腦安裝 鑒於谷歌最新推出的Android Studio備受開發者的推崇,所以也跟著體驗一下。 一、介紹Android Studio Android Studio 是一個Android
node.js零基礎詳細教程(7):node.js操作mongodb,及操作方法的封裝
font 裏的 ges 格式 上進 ins 方法 回調函數 方式 第七章 建議學習時間4小時 課程共10章 學習方式:詳細閱讀,並手動實現相關代碼 學習目標:此教程將教會大家 安裝Node、搭建服務器、express、mysql、mongodb、編寫後臺業務邏輯、編寫接口
從Git到GitHub,詳細教程
文件夾 想象 可能 機制 安裝完成 公開 style run 離線 眾所周知,一個稍微有點規模的項目,都不可能是一個人單打獨鬥完成的(能完成的大神別打我),所以,一個高效的項目團隊就需要一個NB的工具來進行有效的交流(曾經有人問我企鵝不就可以嗎,我竟無言以對),今天就把我學
mysql安裝圖解 mysql圖文安裝教程(詳細說明)
解壓縮 led mes mysql服務器 conf ica 之前 可用 行數 下面的是MySQL安裝的圖解,用的可執行文件安裝的,詳細說明了一下!打開下載的mysql安裝文件mysql-5.0.27-win32.zip,雙擊解壓縮,運行“setup.exe”,出現如下界面