1. 程式人生 > >初探JNI技術,HelloWorld 圖文詳細教程

初探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”,出現如下界面