1. 程式人生 > >JAVA之JNI從頭完整例項

JAVA之JNI從頭完整例項

Java呼叫dll

準備階段: 1).Java 環境 JDK(其實這個沒啥說的....)

              2).MyEclipse或者Eclipse(這個自己選擇)

              3).C語言IDE Microsoft Visual C++6.0(這個也可以自己選擇)

    以下步驟中的使用的工具都是以我個人所使用的為例

    第一步:開啟Eclipse建如圖專案: 生成Java與C之間的通訊約定介面     

程式碼如下:

/**
 * 主要就是生成Java與C/C++之間進行通訊的約定介面
 * */
public class HelloWorld {
	
	static {
		System.loadLibrary("HelloWorld");
	}
	
	public HelloWorld() {
	}
	
	public native int init(int lPort);
	
	public native void print(String str);
	
}

 第二步:找到專案所在的Eclipse目錄空間,屬性中檢視(Eclipse按快捷鍵 Alt+Enter )

    

然後開啟CMD將目錄切換到HelloWorld.java目錄下,例如我這兒目錄就是 "E:\workspace\JavadllDemo\src\" 然後使用javah命名生成待會編譯C時要用的標頭檔案如圖(先編譯HelloWorld.java生成class在使用javah命令):

 第三步:該寫我們的dll檔案了,開啟Microsoft Visual C++6.0

 

建立好以後,在將剛才E:\workspace\JavadllDemo\src目錄下面那個生成好的HelloWorld.h檔案複製到C的工作空間中,但是由於在編譯能被java程式呼叫也能被C程式呼叫的dll的時候還需要兩個標頭檔案,一個是jni.h 一個是jni_md.h

這兩個檔案分別位於你的jdk安裝目錄中include資料夾中 JAVA_HOME\jdk1.6.0_17\include\jni.h  ,JAVA_HOME\jdk1.6.0_17\include\win32\jni_md.h

將這兩個檔案還有HelloWorld.h一共三個檔案一起復制到C專案的工作空間中,複製到C專案工作空間後還需要改一下HelloWorld的標頭檔案引入方式 需要把#include <jni.h> 換成 #include "jni.h" 最後如下圖:

第四步:寫dll裡面的要被Java所呼叫的函式

// HelloWorld.cpp : Defines the entry point for the DLL application.
//


#include "HelloWorld.h"

/*
 * Class:     HelloWorld
 * Method:    init
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_HelloWorld_init(JNIEnv *env, jobject job, jint lPort){
	 int number=10;
	 number+=lPort;
	 return number;

}

/*
 * Class:     HelloWorld
 * Method:    print
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject job, jstring str){
	printf("%d\n", str);
}

如下圖所示:

最後組建編譯我們的dll(先重組,在編譯) 如下圖:

編譯過程可能會出現此錯誤:unexpected end of file while looking for precompiled header directive 解決辦法如下圖(alt+f7):

進行如上圖設定後在編譯,如果提示沒出錯,就表示編譯成功!

編譯好以後就會在我們的C專案工作空間Debug資料夾中找到HelloWorld.dll,此時我們把這個HelloWorld.dll複製到我們的Java專案中的lib檔案中,然後一定要配置好我們的Native library path

第五步:測試呼叫我們自己寫的DLL了

新建一個在HelloWorld所在類中在新建一個Test類,寫如下程式碼:

public class Test {
	public static void main(String[] args) {
		HelloWorld hw=new HelloWorld();
		hw.print("Hello World!");

		int number=hw.init(123);
		System.out.println(number);
	}
}

寫完以後直接執行Test類

最後結果如圖所示:

文章略顯粗糙,但按照步驟來,應該是沒問題的,歡迎一起交流!

相關推薦

JAVAJNI從頭完整例項

Java呼叫dll 準備階段: 1).Java 環境 JDK(其實這個沒啥說的....)               2).MyEclipse或者Eclipse(這個自己選擇)               3).C語言IDE Microsoft Visual C++6

Java,AXIS,webService 呼叫 完整例項 xml 入參出參

* @param model * @return */ @ResponseBody @RequestMapping(value = "getDbPatientInfo" ) public String listForGds(String message) {

android studio 使用 jni 編譯 opencv 完整例項 影象邊緣檢測!從此在andrid中自由使用 影象匹配、識別、檢測

1 package io.github.froger.jni; 2 3 import android.app.Activity; 4 import android.graphics.Bitmap; 5 import android.graphics.drawable.BitmapDra

Java IO 程式設計(BIO、NIO、AIO完整例項程式碼)

      本文會從傳統的BIO到NIO再到AIO自淺至深介紹,並附上程式碼講解。   原始碼地址: https://github.com/kkman2008/java-IO.git     下面程式碼中會使用這樣一個

Java從頭開始編寫簡單課程信息管理系統

query != enter align document edi 輸入 source deploy 編寫簡單的課程管理系統對於新手並不友好,想要出色的完成並不容易以下是我的一些經驗和方法 詳情可參考以下鏈接: https://www.cnblogs.co

JAVAFileNameFilter兩種實現例項程式碼

0 引言 在學習流和檔案時發現檔案的過濾器只寫出了一種實現方式,即匿名類的實現。也可以通過實現FileNameFilter介面的方式完成過濾,特此以作記錄。 1 例項程式碼 1.1 匿名類的實現 package com.dh.ch08;/* @author c

Java 網路IO程式設計總結(BIO、NIO、AIO均含完整例項程式碼)

第一段內容轉載自:http://blog.51cto.com/stevex/1284437 先來個例子理解一下概念,以銀行取款為例: 同步 : 自己親自出馬持銀行卡到銀行取錢(使用同步IO時,Java自己處理IO讀寫)。 非同步

java netty socket庫和自定義C#socket庫利用protobuf進行通訊完整例項

之前的文章講述了socket通訊的一些基本知識,已經本人自定義的C#版本的socket、和java netty 庫的二次封裝,但是沒有真正的發表測試用例。 本文只是為了講解利用protobuf 進行C# 和 java的通訊。以及完整的例項程式碼 java 程式碼 svn 地址,本人開發工具是NetBean

使用Java呼叫ElasticSearch提供的相關API進行資料搜尋完整例項演示

package org.dennisit.elastic.process; import java.util.ArrayList; import java.util.List; import org.dennisit.entity.DataFactory; import org.dennisit.entit

java對JDBC的完整封裝(相容多種資料庫)

目前此程式碼我只用過mysql和oracle資料庫測試過,但相信其它資料庫都是可以的,只要匯入你需要操作的資料庫jar包,驅動等就可,下面上程式碼: import java.sql.CallableStatement; import java.sql.Connection

[2014.1.31] Eclipse、MinGW、JNI編寫C++生成dll, Java端呼叫的完整示例(附java.lang.UnsatisfiedLinkError解決方法)

問題背景:之前的JNI程式設計都是基於Android的NDK工具,生成so檔案供android端呼叫,參見:http://blog.csdn.net/yanzi1225627/article/details/8525720 現在的目標是用eclipse CDT MinGW編寫

關於Java Web 使用 POI 將 資料庫表 匯出 Excel 的完整例項

//匯出Excel  public void exportExcel() throws InterruptedException, IOException{   HSSFWorkbook hwb = new HSSFWorkbook();//第一步,建立一個workbook

java執行緒安全問題靜態變數、例項變數、區域性變數

 java多執行緒程式設計中,存在很多執行緒安全問題,至於什麼是執行緒安全呢,給出一個通俗易懂的概念還是蠻難的,如同《java併發程式設計實踐》中所說: 寫道 給執行緒安全下定義比較困難。存在很多種定義,如:“一個類在可以被多個執行緒安全呼叫時就是執行緒安全的”。 

Java 基礎 do while 迴圈例項

/* 連續錄入學生姓名,輸入“q”則系統退出 */ import java.util.Scanner; public class DoWhile2 { public static void main(String[] args) { Scanner in=new Sc

Java小遊戲鬥地主遊戲例項Map集合

Map的特點是什麼? 1、Map物件是一個雙列的容器 2、兩列分別對應key和value,二者一一對應,是對映關係 3、Map中的資料以鍵值對的形式儲存 4、鍵值是唯一的,不能重複的 HashSet()和HashMap()之間的關係? HashSet()底層是HashMap

java入門---資料結構操作例項壓棧出棧的方法實現字串反轉

    以下例項演示了使用使用者自定義的方法 StringReverserThroughStack() 來實現字串反轉:import java.io.IOException; public class

JAVA JNI開發應用例項

一、基礎理論 百科介紹:JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通訊(主要是C&C++)。從Java1.1開始,JNI標準成為java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行互動。JN

androidJNI引數傳遞 (Java方法呼叫)

從Java 1.1開始,Java Native Interface (JNI)標準成為java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行互動。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計 的,但是它並不妨礙你使用其他語言,只要呼叫約定受支援就可

Android apk安裝過程及JavaJNI讀取安裝包內assets資原始檔的兩種方法(附原始碼例項)

問題背景:在PC上的程式可以輕鬆使用./或不用指明,預設讀取的就是程式所在路徑內的檔案。但在Android上,應用程式被打包成apk,程式執行時無法直接獲取apk(壓縮包)內的檔案。但在一些特殊場合,如載入影象處理訓練好的分類器、模型等資料,要求每個apk到手機上都能執行,就

java呼叫jni例項(eclipse)

何為jni     jni是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通訊(主要是C&C++)。 本例子是在eclipse下進行簡單的jn