C++/Java中的JNI-Listener-是否可以在C++中实例化Java对象并将其作为参数使用?

 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
}

有可能

C++/Java中的JNI-Listener-是否可以在C++中实例化Java对象并将其作为参数使用?

  • 在DLL上注册A Listener对象(据我发现,应该没问题)
  • 在C/C ++代码中实例化Info对象,并将其用作调用Listener.eventOccured(Info…)?
  • 的参数

或实现从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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。