当前位置: 首页 > 知识库问答 >
问题:

JNI分段错误创建新对象

葛泳
2023-03-14

我是JNI(和java)的新手,所以如果这只是一个愚蠢的错误,我提前道歉。但是,经过大量的搜索,我找不到一个解释或解决办法。

我有一个名为Tagged的参数化Java类

Java类:

public class Tagged<T> {
    private final T value;
    private long ptr;

    private TaggedValue(T value, long ptr){
        this.value = value;
        this.ptr = ptr;
    }
}

JNI代码:

JNIEXPORT jobject JNICALL Java_package_Class_function (JNIEnv * env, jclass cls, ...){

  // Find Java class
  jclass c = (*env)->FindClass(env, "package/Tagged");
  if (c == 0) {
      printf("Find Class Failed.\n");
  }else{
      printf("Found class.\n");
  }

  // Find Tagged<T> constructor
  jmethodID constructor = (*env)->GetMethodID(env,c, "<init>", "(Ljava/lang/Object;J)V");
  if (constructor == 0) {
      printf("Find method Failed.\n");
  } else {
      printf("Found method.\n");
  }

  // Get value 
  int * valptr = LibraryCall();

  // check that constructor arguments are what we expect
  int val = (int) *valptr;
  printf("Value:  %i\n",val);
  long long addr = (long long) valptr;
  printf("Address: %p = %lld = %p\n",valptr,addr,(void *)addr);

  // Try to create Tagged object
  jobject taggedval = (*env)->NewObject(env, c, constructor, val, addr);
  printf("We never get here\n");

  return taggedval;
}

控制台输出:

Found class.
Found method.
Value:  102583
Address: 0x7fdcc2d209b0 = 140586138077616 = 0x7fdcc2d209b0
#
# A fatal error has been detected by the Java Runtime Environment: 
#
#  SIGSEGV (0xb) at pc=0x0000000109ae9bcf, pid=42140, tid=3847
#
# JRE version: Java(TM) SE Runtime Environment (8.0_66-b17) (build 1.8.0_66-b17)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.66-b17 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.dylib+0x2e9bcf]  JavaCallArguments::parameters()+0x27
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /Users/eleanor/Documents/workspace/av-java/src/hs_err_pid42140.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#
Abort trap: 6

感谢所有的帮助!


共有1个答案

颜实
2023-03-14

您的构造函数接受一个作业对象和一个,您将向其传递一个intlong

也许你可能打算将int包装成java整数?你可能也应该把长投给一个jlong,以防万一长长jlong不是同一类型。

 类似资料:
  • 问题内容: 我需要使用NDK以及JNI将一些功能实现到Android应用程序中。 这是我所写的C代码: 我的问题或多或少在代码内得到了解释。也许还可以:函数(jobject)的返回类型可以吗? 现在,NDKTest.java: 当我尝试运行代码时,它不起作用。 问题答案: 既然是内部类,那么获得它的方法就是 内部类的约定在权威规范中并未真正明确记录,但是根深蒂固地存在于如此多的工作代码中,因此不太

  • 问题内容: 我有以下JNI方法,它可以本地创建Java对象的集合,然后将其返回给Java: 我需要释放用本机代码创建的对象,还是由GC自动完成?如果可以,我该如何将其返回Java? 问题答案: 您不需要释放在本机代码中创建的Java对象。实际上,您不能。当没有其他引用时,垃圾收集器可以释放对象。 有时在本机代码中释放对Java对象的 引用 很有用。当本机代码保存但不再需要对大型对象的引用或大量引用

  • 我试图使用javamail示例包中的ShowMsg.java读取gmail消息,但在运行时不断出现此错误。虽然程序编译得很好。 以下是错误消息: 我运行的命令是,编译它的命令是。javax.mail.jar包含在lib文件夹中 这是一些更短的替代代码,并得到相同的错误:

  • 我在研究JNI的回电 null

  • 非常感谢!

  • 我有一个简单的Android NDK代码与JNI。不幸的是,由于错误,它无法生成: 我已经检查了其他带有相同错误的Stackoverflow问题。但没有一个与我的文件结构相似。