1. 程式人生 > >java中呼叫C/C++編寫的生成的動態連線庫dll檔案介面的簡單例子

java中呼叫C/C++編寫的生成的動態連線庫dll檔案介面的簡單例子

1、首先用java編寫一個簡單類

public class Hello
{
	public native void sayHello();
	static {
		System.loadLibrary("HelloDll");
	}
	public static void main (String[] args) {
    	new Hello().sayHello();
    }
}

使用javac Hello.java編譯該類

再用javah Hello生成Hello.h標頭檔案

2、在Visual C++ 6.0中新建一個動態連結庫工程,工程名為HelloDll

3、在該工程中新建一個頭檔名為:hello.h,將剛才生成的Hello.h檔案中的程式碼複製進去,如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */

#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Hello
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Hello_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

不需要做任何修改

此時新建一個Test.cpp檔案具體實現剛才的標頭檔案中的函式,程式碼如下

#include "Hello.h"
#include <jni.h>

JNIEXPORT void JNICALL Java_Hello_sayHello
(JNIEnv *, jobject){
	printf("Hello world,I'm coming!");
	return;
}

此時若編譯則會報錯,說找不到jni.h檔案,如下:

fatal error C1083: Cannot open include file: 'jni.h': No such file or directory

此時只需操作步驟4即可

4、在jdk的安裝目錄~\jdk1.6.0_25\include下將jni.h和~\jdk1.6.0_25\include\win32下的jni_md.h檔案複製到Visual C++ 6.0的D:\Microsoft Visual Studio\VC98\Include目錄下

5、此時在編譯連結Test.cpp檔案,即可生成動態連結庫檔案:

再將該檔案複製到與Hello.class檔案同一個目錄下,執行java檔案,即可呼叫有C/C++編寫實現的介面,即動態連結庫檔案

執行結果如下:

此即呼叫成功。



相關推薦

java呼叫C/C++編寫生成動態連線dll檔案介面簡單例子

1、首先用java編寫一個簡單類 public class Hello { public native void sayHello(); static { System.loadLibrary("HelloDll"); } public static void

MFC/Qt下呼叫caffe原始碼(二)---MFC下呼叫caffe的動態連線dll檔案

首先,先看下最後的效果吧。 win7 vs2013 新建一個MFC 工程 注:MFC中如何最簡便的方法將圖片顯示到對話方塊中?大家可以搜下,很多種方法,但是我採用的是最簡單的方法,即將opencv視窗繫結到MFC的PIcture control上。 在:

linux下gcc編譯 .c檔案生成動態連結 .so檔案,並測試呼叫該連結

簡單介紹:linux中so檔案為共享庫,和windows下dll相似;so可以共多個程序呼叫,不同程序呼叫同一個so檔案,所使用so檔案不同;so原檔案不需要main函式;例項,1.通過mysqlTest.c中的函式mysql(),生成一個libmysql.so連結庫#inc

LuaLaTeX呼叫外部Lua程式與C語言編寫動態連結

  在LuaLaTeX編譯方式下,雖然可以直接在tex檔案中編寫Lua程式碼,但會受到LaTeX的影響,編寫中並不是很便利。所以我在實際使用中一般都把Lua程式碼的主體部分放在LaTeX的外部,這樣可以完全按照以往的程式設計習慣去編寫。我以前所在的公司,曾經在機器人運動控制系統中使用過Lua

c編譯,呼叫動態連線 (.so檔案)

c編譯,呼叫動態連線庫 (.so檔案) C編譯: 動態連線庫 (.so檔案) Linux動態連結庫.so檔案的命名及用途總結 Linux程式設計練習(二)—— Linux下.so動態庫的建立和呼叫 在“紙上談兵: 演算法與資料結構”中,我在每一篇都會有一個C程式,用於實現演算法和資料

Java呼叫sqlServer的儲存過程(CallableStatement)的幾種簡單情況

一、呼叫不帶引數的儲存過程 --建立儲存過程 create procedure testselect as begin select bno from book; end package com.nc.dao; import java.sql.*; public class test

MFC/Qt下呼叫caffe原始碼(一)---將caffe原始碼生成動態連結dll

本人研一,最近想將用caffe訓出的模型,通過MFC做出一個介面,扔進一張圖片,點選預測,即可呼叫預測分類函式完成測試,並且通過MessageBox彈出最終分類的資訊。 首先通過查資料總結出兩種方法,第一:直接呼叫編譯好的caffe原始碼;(本次用到的原始碼是classif

Linux下gcc編譯生成動態連結*.so檔案呼叫

動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。1、動態庫的編譯下面通過一個例子來介紹如何生成一個動態庫。這裡

【深度學習之Caffe】將模型測試Classification過程生成動態連結dll以方便其他專案呼叫

#include "caffe_classify.h"   #include "head.h"   Classifier::Classifier(const string& model_file,const string& trained_file,const string& mean

vs2010 C++建立和使用動態連結(dll)

一、用C++建立動態連結庫專案:  1、開啟Microsoft Visual Studio 2010,選擇File->New->Project。  2、在NewProject中選擇Inst

QT生成動態連結.so檔案

首先是新建一個工程,選擇C++庫,開啟後是這樣的: 然後輸入新建的名稱,下一步,記得勾選Qtcore那個(就是預設的那個),否則編譯似乎不能通過。因為後面自動生成的.h檔案裡還有這個。 自動生成的有4個檔案一個pro,一個cpp,一個XXX.h檔案,一個XXX_g

linux下生成動態連結so檔案

怎樣在linux下生成動態連結庫即.so檔案? 一、 首先需要一個好的編譯工具,直接用gcc命令列編譯已經不再是一個明智之舉了,一個好的帶編譯工具的環境是很重要的,我選擇的是easyeclipse,它集成了CDT,可以很方便地編寫C和C++程式,它自動集成了gcc編譯器

GCC編譯生成動態連結*.so檔案

動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。 1、動態庫的編譯 下面通過一個例子來介紹如何生成一個動態庫。

IDEA編輯器下 JNI Java呼叫C\C++語言的詳細方法步驟

Mac OS 上進行github的配置 註冊GitHub賬號,直接去官網註冊即可 建立github.io 在自己的主頁,點選”New repository”,即可新建一個版本庫 安裝或更新

Android開發JAVA呼叫C/C++ native程式碼

Android 從Java呼叫C/C++ 當無法用 Java 語言編寫整個應用程式時,JNI 允許您呼叫C/C++本機程式碼。在下列典型情況下,您可能決定使用本機程式碼: 希望用更低階、更快的程式語言C/C++去實現對時間有嚴格要求的程式碼。

Delphi 呼叫 c編寫動態連結,結構體指標作為引數

折騰了一天終於把 結構體指標作為在delphi和c動態連結庫之間函式引數傳遞的問題徹底解決了,花了一天時間的主要原因是沒有領會引數傳遞的精髓。現在把c程式碼和delphi程式碼粘上來,以供後來者學習參考。 delphi程式程式碼: unit Unit3; interfac

java便捷呼叫現成c/c++: cmake使用swig簡介

簡介 swig是個工具,能便捷地讓其它指令碼語言呼叫你使用C語言編寫的程式。更具體的請自己google一下相關資料(如果沒條件上google,用一下baidu應該也能查到點東西)。 在android應用開發中,可能java要大量地呼叫一個現成的c庫的時候,可以考慮用swig轉換一下。

一篇好文之Android 呼叫C程式碼及生成除錯so

不靠譜的朱先生又來了,今天是週五,我又出現了!好了,不為自己多解釋,上週沒發文章,其實我寫了,只是沒有發出來而已……機智ovo。 上週寫的文章是關於GreenDao全面解析,其實當時是想寫一個關於資料庫的系列文章,後來一共就寫了兩篇,SQlite全面解析和GreenDao全面解析。至

Javaenum和C#的異同

3、所有列舉類都繼承了Enum的方法,下面我們詳細介紹這些方法。        (1)  ordinal()方法: 返回列舉值在列舉類種的順序。這個順序根據列舉值宣告的順序而定。                Color.RED.ordinal();  //返回結果:0                Colo

C#呼叫C/C++動態連結(.dll)詳解

第一篇編譯C的動態連線庫 在實際工作中,我們經常會將C語言中的.lib和.h檔案(靜態庫)編譯成動態連線庫.dll檔案(這裡只提供這兩種檔案,沒有完整的工程),以提供給其他語言平臺呼叫。 1,必須有.lib檔案,只有.h檔案是無法編譯動態連線庫的。 2,我使用的是V