JNI:从JVM到C ++的回调无法运行 [英] JNI: Callback from JVM to C++ fails to run

查看:123
本文介绍了JNI:从JVM到C ++的回调无法运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从C ++程序启动JVM。

I start JVM from C++ program.

C ++代码:

JNIEXPORT jobject JNICALL com_javelin_JavelinMarketData_callBackIntoNative(JNIEnv* env, jobject obj, jlong ptr)
{
        std::cout << "com_javelin_JavelinMarketData_callBackIntoNative called" << std::endl;
}

int main()
{
       JavaVM* jvm;
       JNIEnv* env;
       ...
       JNI_CreateJavaVM(&jvm, (void **)&env, &args);
       jmethodID mainMethod =  env->GetStaticMethodID(helloWorldClass, "main", "([Ljava/lang/String;)V");
       env->CallStaticVoidMethod(helloWorldClass, mainMethod, ...);
}

那么我需要从java调用的C ++函数:

then I need my C++ function called back from java:

Java代码:

native void callBackIntoNative(long ptr);

public void onResponse(long param)
{
    System.out.println("Calling callBackIntoNative()");
    callBackIntoNative(param); 
}



当我运行我的C ++程序时,JVM正确启动,调用callBackIntoNative()出现以下接受:

When I run my C++ program, JVM starts correctly, but after it prints "Calling callBackIntoNative()" the following acception appears:

Exception during callBackIntoNative(): 'com.javelin.JavelinMarketData.callBackIntoNative(J)V'
java.lang.UnsatisfiedLinkError: com.javelin.JavelinMarketData.callBackIntoNative(J)V



Can you please help?

推荐答案

谢谢,但我发现了一个解决方案:我应该注册我的C ++函数为native方法使用代码:

Thanks, but I found a solution: I should have registered my C++ function as a native method using the code:

const JNINativeMethod methods[] = { { "callBackIntoNative", "(J)V", (void*)&com_javelin_JavelinMarketData_callBackIntoNative } };

const int methods_size = sizeof(methods) / sizeof(methods[0]);

jclass jClass = env->FindClass("com/javelin/JavelinMarketData");

env->RegisterNatives(jClass, methods, methods_size);

现在工作正常。

这篇关于JNI:从JVM到C ++的回调无法运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆