1. 程式人生 > >vs2013封裝dll以及java呼叫

vs2013封裝dll以及java呼叫

public class SVBufferAppend {
    public static native int byteAppend(byte[] svBuffer, int offset,int ct,int cl,int vl,int value);

}

編譯成.class檔案   javah -classpath . -jni SVBufferAppend   生成.h檔案  如下

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

#ifndef _Included_SVBufferAppend
#define _Included_SVBufferAppend
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     SVBufferAppend
 * Method:    byteAppend
 * Signature: ([BIIIII)I
 */
JNIEXPORT jint JNICALL Java_SVBufferAppend_byteAppend
  (JNIEnv *, jclass, jbyteArray, jint, jint, jint, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

用VS新建win32 的專案   配置如下

選擇  程式型別  DLL     勾上匯出符號      去掉 安全開發生命週期檢查的勾(SDL)

右擊專案選擇屬性    設定平臺  X64  

配置屬性 常規  配置型別  dll動態庫

vc++目錄   選擇包含目錄  C:\java\jdk1.7.0_80\include   C:\java\jdk1.7.0_80\include\win32

                  庫 目錄     C:\java\jdk1.7.0_80\lib

然後包含之前生成的 .h檔案 

編寫對應的方法程式碼

JNIEXPORT jint JNICALL Java_SVBufferAppend_byteAppend
(JNIEnv * a, jclass b, jbyteArray c, jint offset, jint ct, jint cl, jint vl, jint value){

    /*
	jbyte* bytebuf = new jbyte[byteArrayLength];

	//JAVA to DLL
	a->GetByteArrayRegion(c, 0, byteArrayLength, bytebuf);
	
	printf("%x\n", *bytebuf);
	printf("%x\n", *(bytebuf+1));
	printf("%x\n", *(bytebuf+2));
	
	//DLL set to JAVA
	//a->SetByteArrayRegion(c, 0, byteArrayLength, bytebuf);
	
	delete[] bytebuf;
    */

	// 獲取傳過來的陣列長度
	int byteArrayLength = a->GetArrayLength(c);
	printf(" byteArrayLength=%d\n", byteArrayLength);

    // 獲取陣列操作
	jbyte* bytebuf = a->GetByteArrayElements(c, JNI_FALSE);

	
	a->ReleaseByteArrayElements(c, bytebuf, 0);

	return 0;

}

最後java直接使用方法名呼叫即可