Java 不理解为什么JNIEnv->;GetFieldID失败

Java 不理解为什么JNIEnv->;GetFieldID失败,java,java-native-interface,Java,Java Native Interface,在java中,我有: package com.mypkg.utils; ... public class attitude_calculator { private long native_ptr_; ... public native RealMatrix R(); } 在jni层中,我需要访问native\u ptr。以下是我试图做到这一点的方式: JNIEXPORT jobject JNICALL Java_com_mypkg_utils_attitude_1

在java中,我有:

package com.mypkg.utils;
...

public class attitude_calculator
{
    private long native_ptr_;
    ...
    public native RealMatrix R();
}
在jni层中,我需要访问
native\u ptr
。以下是我试图做到这一点的方式:

JNIEXPORT jobject JNICALL 
Java_com_mypkg_utils_attitude_1calculator_R(JNIEnv *jenv,
                                            jobject jobj)
{
  myns::AttitudeCalculator *nobj = nullptr;
  jlong addr = 0;
  jfieldID jfid = 0;
  jclass jcls;

  jcls = jenv->GetObjectClass(jobj);
  jfid = jenv->GetFieldID(jcls, "native_ptr_",
    "Lcom/mypkg/utils/attitude_calculator$native_ptr_;");
  if (jfid == nullptr || jfid == NULL) {
    ...
  }
  ...
}
调用
GetFieldID
会导致

java.lang.NoSuchFieldError


调用
GetFieldID
的正确方法是什么?

native\u ptr\u
是一个
长的
,因此它的签名是
“J”
,而不是
“Lcom/mypkg/utils/attitude\u calculator$native\u ptr;”

因此,电话应该是:

jfid = jenv->GetFieldID(jcls, "native_ptr_", "J");

这些字符串在文档中的何处列出?如果能有一个推荐人,那就太好了,这样我以后就不用再问了,除非这是一件非常重要的事情。向下滚动到类型签名。或者,
javap-v-s com.mypkg.utils.attitude\u calculator | grep-A 1“native\u ptr\u1”
您可以删除方法签名的-v。