JNI使用多个线程从C ++调用Java

纳布罗扬

我正在一个项目中,在该项目中我使用C ++代码(使用JNI)调用Java函数,并且遇到了有关多线程的问题。我想调用Java搜索功能,并且我想为每个调用创建一个单独的线程。我有一个单例MainClass和嵌套Query类。Query类是从继承的QThread代码看起来像这样

MainClass::MyQuery query("<some search query>");
query.LaunchQuery();


//functions of Query   
void MainClass::MyQuery::LaunchQuery() const
{
    this->start();
}

void MainClass::Query::run()
{
    const MainClass& mainClass = MainClass::GetInstance();
    const jclass& obj = mainClass.GetClass();
    JNIEnv& env = mainClass.GetJavaEnvironment();
    jmethodID methodId = env.GetMethodID(obj, "SearchQuery", "(Ljava/lang/String;)V"); //Run-time error

    if(methodId != 0)
    {
        //calling "SearchQuery" function
    }

现在,如果在单个线程中运行此代码-一切都很好,但是如果尝试在代码上方运行-使用多线程,"Unhandled exception at 0x777715de in MyApp.exe: 0xC0000005: Access violation reading location 0x000000ac."当我尝试获取方法ID时,它将导致消息运行时错误我也尝试过,boost::thread但结果是一样的。

那么,为什么当我在单独的线程中执行此操作时却失败,而在同一线程中一切正常呢?有任何想法吗?

格雷厄姆·格里菲思(Graham Griffiths)

在JNI文档中向下滚动到“附加到VM”:

http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html

JNI接口指针(JNIEnv)仅在当前线程中有效。如果另一个线程需要访问Java VM,则必须首先调用AttachCurrentThread()将其自身附加到VM并获取JNI接口指针。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JNI使用多个线程从C ++调用Java

来自分类Dev

使用JNI,多线程从Fortran调用Java

来自分类Dev

多线程JNI调用

来自分类Dev

JNI:C ++是否调用Java异步?

来自分类Dev

使用jni从本机代码调用Java方法

来自分类Dev

使用jni从本机代码调用Java方法

来自分类Dev

无法使用JNI在Android Lollipop中从C ++到Java进行JNI调用

来自分类Dev

使用Java线程进行异步调用

来自分类Dev

如何使用多个参数从C / C ++调用Java方法?

来自分类常见问题

Java8; 利用一个线程上的睡眠时间,但使用多个可调用对象

来自分类Dev

从Java调用c ++ dll

来自分类Dev

在Java中创建多个线程时,为什么没有调用系统调用来创建线程?

来自分类Dev

Java线程调用父函数

来自分类Dev

Java线程调用父函数

来自分类Dev

使用有效的指针从C调用方法后,Java JNI NullPointerException

来自分类Dev

从64位Os使用jni4net从Java调用C#时出错

来自分类Dev

使用jni从c ++调用Java函数:无法找到静态方法ID

来自分类Dev

如何使用JNI从JAVA调用C ++中带有参数的函数?

来自分类Dev

您可以使用JNI在从Java调用的c ++函数中创建新的JVM吗?

来自分类Dev

从64位Os使用jni4net从Java调用C#时出错

来自分类Dev

JNI C ++环境中的Java线程仅使用一个内核。手臂处理器和Ubuntu

来自分类Dev

我们如何在Java中调用多个线程?

来自分类Dev

我们如何在Java中调用多个线程?

来自分类Dev

如何生成使用std :: thread C ++调用同一功能的多个线程

来自分类Dev

如何使用std :: thread C ++生成多个调用同一函数的线程

来自分类Dev

从C ++ JNI NDK函数调用Java方法两次

来自分类Dev

JNI:定期从C调用Java方法不起作用

来自分类Dev

Java JNI 调用 FindClass 从 C++ 程序失败

来自分类Dev

从多个线程调用accept()

Related 相关文章

  1. 1

    JNI使用多个线程从C ++调用Java

  2. 2

    使用JNI,多线程从Fortran调用Java

  3. 3

    多线程JNI调用

  4. 4

    JNI:C ++是否调用Java异步?

  5. 5

    使用jni从本机代码调用Java方法

  6. 6

    使用jni从本机代码调用Java方法

  7. 7

    无法使用JNI在Android Lollipop中从C ++到Java进行JNI调用

  8. 8

    使用Java线程进行异步调用

  9. 9

    如何使用多个参数从C / C ++调用Java方法?

  10. 10

    Java8; 利用一个线程上的睡眠时间,但使用多个可调用对象

  11. 11

    从Java调用c ++ dll

  12. 12

    在Java中创建多个线程时,为什么没有调用系统调用来创建线程?

  13. 13

    Java线程调用父函数

  14. 14

    Java线程调用父函数

  15. 15

    使用有效的指针从C调用方法后,Java JNI NullPointerException

  16. 16

    从64位Os使用jni4net从Java调用C#时出错

  17. 17

    使用jni从c ++调用Java函数:无法找到静态方法ID

  18. 18

    如何使用JNI从JAVA调用C ++中带有参数的函数?

  19. 19

    您可以使用JNI在从Java调用的c ++函数中创建新的JVM吗?

  20. 20

    从64位Os使用jni4net从Java调用C#时出错

  21. 21

    JNI C ++环境中的Java线程仅使用一个内核。手臂处理器和Ubuntu

  22. 22

    我们如何在Java中调用多个线程?

  23. 23

    我们如何在Java中调用多个线程?

  24. 24

    如何生成使用std :: thread C ++调用同一功能的多个线程

  25. 25

    如何使用std :: thread C ++生成多个调用同一函数的线程

  26. 26

    从C ++ JNI NDK函数调用Java方法两次

  27. 27

    JNI:定期从C调用Java方法不起作用

  28. 28

    Java JNI 调用 FindClass 从 C++ 程序失败

  29. 29

    从多个线程调用accept()

热门标签

归档