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類
最後結果如圖所示:
文章略顯粗糙,但按照步驟來,應該是沒問題的,歡迎一起交流!
相關推薦
JAVA之JNI從頭完整例項
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
JAVA之FileNameFilter兩種實現例項程式碼
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
android之JNI引數傳遞 (Java方法呼叫)
從Java 1.1開始,Java Native Interface (JNI)標準成為java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行互動。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計 的,但是它並不妨礙你使用其他語言,只要呼叫約定受支援就可
Android apk安裝過程及Java、JNI讀取安裝包內assets資原始檔的兩種方法(附原始碼例項)
問題背景:在PC上的程式可以輕鬆使用./或不用指明,預設讀取的就是程式所在路徑內的檔案。但在Android上,應用程式被打包成apk,程式執行時無法直接獲取apk(壓縮包)內的檔案。但在一些特殊場合,如載入影象處理訓練好的分類器、模型等資料,要求每個apk到手機上都能執行,就
java呼叫jni例項(eclipse)
何為jni jni是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通訊(主要是C&C++)。 本例子是在eclipse下進行簡單的jn