如何使用JNI从本机C/ c++代码调用Java applet回调函数
How to call a Java applet callback function from native C/C++ code using JNI.
如何使用JNI从本地C/c++代码调用Java applet回调函数。请让我知道如何才能正确地做到这一点。请提供任何代码片段。
// Java Applet code
public class TestApp extends Applet {
private native void TestMethod(int nValue);
public void callback(int nValue) {
// DISPLAY SOME MESSAGE FROM NATIVE DLL RECEIVED
}
static {
System.load("c/temp/TestDll.dll");
}
}
//TestDll.cpp JNIEnv *g_env;
jobject g_object;
jmethodID g_method;
JNIEXPORT void JNICALL
Java_Callbacks_TestMethod(JNIEnv *env, jobject obj, jint Value)
{
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
g_env = env;
g_Object = obj;
g_method = mid
}
// Cannot be called within the above function
void TestDllCallbackFunction (int nValue)
{
// This is where i want to call the Java callback function… would the below work???
(*g_env)->CallVoidMethod(g_env, g_object, g_method, ((jint)Value);
}
您还应该考虑另一种解决方案,作为从c++回调到Java的替代方案:
- 创建一个额外的Java线程来等待c++的响应
- 让Java线程调用一个c++函数,该函数阻塞一个条件变量(或类似的,取决于你的操作系统),直到响应准备好返回。
- 当你想调用回调时,让上面的c++函数拥有数据并给条件变量发信号。然后返回数据。
回调当然可以完成,但我认为它们增加了不必要的复杂性。使用上面的方法,你可以把东西更好地分开。
相关文章:
- 无法从 C 调用C++代码而没有错误
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 从 ASM 调用C++代码中标准库的链接
- 如何从C#调用C 代码及其调用的代码
- 使用带有 MEX 包装器的帮助程序 C 文件从 MATLAB 2016 调用C++代码时出现问题
- 从 Swift 调用C++代码比调用 C 代码更"expensive"还是更慢?
- 从x64中的C#调用C 代码,所有参数都会偏移一个
- 使用C#的结构调用C 代码
- Golang:在跨平台调用C++代码
- 从 C# 调用 C/C++ 代码
- 调用 C 代码的 Win32 应用程序
- 从C#.NET应用程序调用C/C 代码
- 如何使用JNA从Android调用C/C 代码
- 当在C#中的WPF应用程序中单击一个按钮时,如何调用C 代码
- 从 C# 调用C++代码而不创建 dll
- 通过嵌入式 Python 调用C++代码
- 当我从C#代码调用C++代码时,它是线程安全的吗
- 如何从Node.js调用C++代码
- 让非托管 C++ 代码调用调用 C# 代码的托管 C++ 代码
- 使用C++中的引用从C#调用C++代码时出错