java - 创建新对象时出现 JNI 段错误

标签 java segmentation-fault java-native-interface

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

我有一个名为 Tagged<T> 的参数化 Java 类。 Tagged<T> 的 Java 构造函数接受一个对象 T和一个长ptr 。 C 代码有一个值,应该创建一个值为 v 的 Tagged 对象。以及该值的内存地址。但是,当我调用 NewObject 时,出现段错误。不确定问题是否出在泛型类型构造函数(用整数调用)、Java/C 整数类型之间的不匹配(long 与 long long 与 long)、愚蠢的错误或我没有考虑过的问题。

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

感谢您的任何/所有帮助!

最佳答案

您的构造函数接受一个 jobject 和一个 long,并且您向它传递一个 int 和一个 long long >.

也许您可能打算将 int 包装到 java Integer 中?而且您可能也应该将 long 转换为 jlong​​,以防 long longjlong​​ 类型不同。

关于java - 创建新对象时出现 JNI 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37337360/

相关文章:

java - 如何存储从mysql检索到的数据并在java中显示为用户搜索的结果

java - 结果集不会进入 while 循环并设置值

c - 段错误释放内存 - 仅当分配的内存太多时

java - 如何使用具有隐含默认构造函数的 JNI 创建对象

java - 如何查找包

java - 从 C 调用 Java

java - 将 NSData(plist 格式)转换为 Java String

java - 获取(并行)流的状态

c - main 执行前出现段错误

C:损坏的迭代器发送 D-BUS 信号