1
Q
回電JNI
A
回答
0
首先,檢查Swig。它將C++封裝在Java中,並且具有「導演」功能,可以更輕鬆地從Java調用C++方法。
用生JINI,你不能直接做到這一點。儘管可以使RegisterNatives()調用綁定本地方法,但不能更改它。如果你想通過指針調用C函數,你需要分兩步來完成。我對此非常感興趣,因爲JNI非常冗長乏味。基本的技巧是,將C函數指針包裝在一個java long中。
首先聲明一個Java類:
對類文件public class Callback {
public Callback(long cMethodPointer) { this.cMethod = cMethod; }
public void doCallback() { callCMethod(cMethod); }
public static native void callCMethod(long cMethod);
public long cMethod;
}
運行JAVAH,你會得到一個存根頭產生的,看起來像:
JNIEXPORT void JNICALL Java_Callback_callCMethod
(JNIEnv *, jclass, jlong);
在DLL中實現該方法/ so:
typedef void (*FP)();
JNIEXPORT void JNICALL Java_Callback_callCMethod
(JNIEnv *, jclass, jlong pointer) {
((FP)(void*)pointer)();
}
並在您的Java main()方法中調用該DLL上的System.loadLibrary()。
最後,從C/C++代碼,你將需要創建通過JNI回調對象的實例,並通過指向一個實際的方法吧:
void MyFunction() { ... }
void Register() {
jclass cls = env->FindClass("Callback");
jmethodID mid = env->GetMethodID(cls, "<init>", "(J)V");
jvalue arg;
arg.j = (jlong)(void*)MyFunction;
jobject callback = env->NewObjectA(confCls, mid, &arg);
}
所以這給你一個全新的Callback對象,指向您的C函數!但是,那麼,你如何做到這一點?那麼,你必須通過JNI(步驟省略)傳遞迴調對象到Java,讓您的Java代碼中有回調對象從中調用你的C方法:
public class Foo {
public Callback callback;
public void doSomeStuff() {
...
callback.doCallback();
}
}
相關問題
- 1. Android的JNI電話
- 2. JNI C++回調
- 3. jni中的回調
- 4. JNI回調線程
- 5. JNI- FindClass返回null
- 6. JNI - GetObjectField返回NULL
- 7. JNI返回類型
- 8. JNI-FindClass函數返回null
- 9. JNI的GetMethodID返回null
- 10. JNI findClass的返回NULL
- 11. JNI CallStaticLongMethod總是返回0L
- 12. jni loadlibrary,findLibrary返回null
- 13. 在Android上,可Java調用JNI,然後JNI回調到Java?
- 14. 在JNI中的回調幫助
- 15. 第三方庫的JNI GetMethodID返回NULL
- 16. JNI方法不回調Java方法
- 17. 將uint16轉換爲jint並返回JNI
- 18. libhdfs JNI FindClass返回null與java.io.FileNotFoundException
- 19. JNI從一個DWORD值返回
- 20. 從JNI中返回阿拉伯數字
- 21. 從JNI返回狀態信息到JAVA
- 22. 在JNI中返回多維數組
- 23. JNI INT方法從外返回
- 24. JNI FindClass返回NULL - 非常奇怪
- 25. 從JNI返回一個字節[]到Java
- 26. JVM崩潰attachCurrentThread JNI回調調用
- 27. JNI CallStaticVoidMethod主不會返回到C++
- 28. JNI和DLL:雙向交互(回調)
- 29. JNI GetObjectClass總是返回的java /郎/類
- 30. JNI:未找到類或FindClass返回NULL
註冊本地回調,並從該回調函數通過JNI調用java。 – Flavio
不要忘記'AttachCurrentThread',否則你將無法回撥給Java。 –
感謝您提供的信息......其實我對JNI和原生編程有所瞭解......請分享一些鏈接或代碼片段以供參考? – user1844484