【问题标题】:Error Calling a Java Method From Native C++ Using JNI (ACCESS_VIOLATION error)使用 JNI 从本机 C++ 调用 Java 方法时出错(ACCESS_VIOLATION 错误)
【发布时间】:2012-01-02 20:19:00
【问题描述】:

我遇到了一个问题:我尝试调用一个应该在控制台中打印某些内容的 java 方法。它是使用 JNI 从 C++ 本机 dll 调用的。 问题是它不起作用,我得到了那个错误:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6c5f5253, pid=4472, tid=4956
#
# JRE version: 6.0_29-b11
# Java VM: Java HotSpot(TM) Client VM (20.4-b02 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  0x6c5f5253
#
# An error report file with more information is saved as:
# C:\location\MyApp\hs_err_pid4472.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

这是我用来调用一个简单的 java 方法的 C++ 代码,该方法将在控制台中打印一行:

jclass jTablObjClass = env->FindClass("MainFrame/Jni/TablesObjects");           // get jclass   
jmethodID printMethId = env->GetMethodID(jTablObjClass, "print", "()V");        // get jmethod
env->CallVoidMethod(jTablObjClass, printMethId);                                // call jmethod

请帮忙! ^^

【问题讨论】:

  • 添加返回值检查以找出准确的故障位置。检查所有返回值是否不为空。
  • 其实crash的根源是调用了void java方法env->CallVoidMethod(jTablObjClass, printMethId);但是其实没有理由让它crash所以...
  • jTablObjClassprintMethId 不为空?
  • 请问我该如何检查?有我应该使用的功能吗?
  • if(jTablObjClass == NULL) {report an error and do something}

标签: java c++ methods java-native-interface


【解决方案1】:

哦,刚刚意识到。您正在调用CallVoidMethod,但第一个参数是一个类。如果方法是静态的,你应该使用GetStaticMethodIDCallStaticVoidMethod,如果方法不是静态的,你应该给一个对象实例,而不是一个类。

【讨论】:

  • 非常感谢!你很棒!我尝试将我的 java 方法设置为“静态”,并在我的本机 c++ 代码中调用GetStaticMethodID,然后调用CallStaticVoidMethod,它确实成功了! ^^ 所以非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多