2023-01-20 342
JNI可以使用以下可用吗?
public NativeClass {
static {
System.loadLibrary("dll");
}
public static native void addListener(Listener listener);
}
public interface Listener {
public void eventOccurred(Info info);
}
public Info {
private final String s1;
private final String s2;
public Info(String s1, String s2);
// ... getters for use in Java
}
有可能
的参数
或实现从DLL获取一些信息的听众的好方法?
就我而言 – 我们有一个DLL可以做一些工作.我们称此DLL来自Java.现在,我们想将听众附加到DLL上,以在工作时推动我们一些进度信息.上面的示例是侦听器部分,我不知道该构造函数是否可以通过C/C ++调用Java构造函数.
一个提示在哪里可以找到一份文档,描述答案会很好 – 我找不到Infos,这回答了我的问题.
描述C/C ++部分的小片段是锦上添花:)
简短的答案是肯定的,您可以握住,实例化和通过JNI中的Java对象.
在JNI文档中,您会发现可以为您执行此功能的功能.
http://docs.oracle.com/javase http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
您还将使用javap -s和javah来帮助找到用于JNI使用并制作JNI标题的Java方法签名.参见 http:///docs.oracle.com/javase/7/docs/technotes/tools/windows/javap.html & http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javah.html
这是您将要做的事情的示例.我尚未测试它,因此只需将其用作编写自己的参考即可.注意:请注意软件包符号(我假设没有包装)和异常.任何JNI调用(env->…)可能会发生异常,因此请检查有关如何处理异常的文档(ExceptionCheck,ExceptionDescribe,ExceptionClear).
JavaVM * savedVM = NULL;
JNIEXPORT void JNICALL Java_NativeClass_addListener(JNIEnv *env, jobject obj_instance, jobject listener_instance)
{
env->GetJavaVM( &savedVM );
//save listener_instance for use later
saved_listener_instance = listener_instance;
}
void doSomething()
{
//Get current thread JNIEnv
JNIEnv * ENV;
int stat = savedVM->GetEnv((void **)&ENV, JNI_VERSION_1_6);
if (stat == JNI_EDETACHED) //We are on a different thread, attach
savedVM->AttachCurrentThread((void **) &ENV, NULL);
if( ENV == NULL )
return; //Cant attach to java, bail
//Get the Listener class reference
jclass listenerClassRef = ENV->GetObjectClass( saved_listener_instance );
//Use Listener class reference to load the eventOccurred method
jmethodID listenerEventOccured = ENV->GetMethodID( listenerClassRef, "eventOccurred", "(LInfo;)V" );
//Get Info class reference
jclass infoClsRef = ENV->FindClass( "Info" );
//Create Info class
jobject info_instance = ENV->NewObject( infoClsRef, ..... );//For you to fill in with your arguments
//invoke listener eventOccurred
ENV->CallVoidMethod( saved_listener_instance, listenerEventOccured, info_instance );
//Cleanup
ENV->DeleteLocalRef( info_instance );
}
这是一个很好的例子: >
此处详细说明了相同的代码:
android-cd8226″ rel=” rel=”nore=”norefoltollown www.hackster.io/user2657268124/a-beginner-s-guide-to-implement-implement-jni-callbacks-in-indroid-cd8226
以上所述是小编给大家介绍的C++/Java中的JNI-Listener-是否可以在C++中实例化Java对象并将其作为参数使用?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26097.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态