多表格合并一起
988
2022-05-30
JNI的全稱是java native interface,用來調用某些特定于系統平臺或者硬件的操作,但是它只能調用c/c++的代碼,若是其它語言代碼,只能通過c/c++進行二次調用。
關于JNI的完整技術文檔,大家可以查看下面這個網址:
http://java.sun.com/j2se/1.5.0/docs/guide/jni/
下面我們看下JNI如何執行回調函數:
我們知道在c/c++回調函數可以通過函數指針執行,但是在Java中已經沒有指針的概念,在這里,我們先傳遞一個類對象給native函數,然后再dll中調用期望的函數即可。
下面的這個例子中,我們通過回調傳遞一個字符串給java,這在java和c/c++混合編程時傳遞dll內部的出錯或其他信息到java層是很有用的。
1. 首先創建一個java類文件,封裝一個native函數和一個用于回調的函數
package jni;
public class Log{
static{
System.loadLibrary("mylib");
}
//用來回調,輸出c代碼層的信息
public void output(String out){
System.out.println(out);
}
//native函數,用來傳遞Log對象,在jni中調用Log對象的output方法
public native void test(Log log);
public static void main(String[] args){
Log log = new Log();
log.test(log);
}
}
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class jni_Log */
#ifndef _Included_jni_Log
#define _Included_jni_Log
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_Log
* Method: test
* Signature: (Ljni/Log;)V
*/
JNIEXPORT void JNICALL Java_jni_Log_test
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif
#include
#include "jni_Log.h"
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReasion,PVOID pvReserved)
{
return TRUE;
}
JNIEXPORT void JNICALL Java_jni_Log_test(JNIEnv * env, jobject obj, jobject log)
{
jclass cls = (*env)->GetObjectClass(env, log);//得到Log類
jmethodID jmid = (*env)->GetMethodID(env, cls, "output", "(Ljava/lang/String;)V");
jstring info = (*env)->NewStringUTF(env, "i am a error!");
(*env)->CallVoidMethod(env,log, jmid,info);
(*env)->ReleaseStringUTFChars(env,info,(*env)->GetStringUTFChars(env, info, FALSE));
}
C++ Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。