Java JNITINAVEINTERFACE_*为空

Java JNITINAVEINTERFACE_*为空,java,c++,java-native-interface,Java,C++,Java Native Interface,我正在开发一个JNI应用程序。但是,结构struct JNIEnv\ucode>中的JNITINAVEINTERFACE_*为空,因此导致对JNI(例如:env->NewStringUTF(…))函数的任何调用抛出分段错误JNIEnv\uzstruct如下所示: struct JNIEnv_ { const struct JNINativeInterface_ *functions; . . . 老实说,我不知道如何解决这个问题,因为我认为当您调用System.loadLibrary(

我正在开发一个JNI应用程序。但是,结构
struct JNIEnv\ucode>中的JNITINAVEINTERFACE_*为空,因此导致对JNI(例如:
env->NewStringUTF(…)
)函数的任何调用抛出分段错误
JNIEnv\uz
struct如下所示:

struct JNIEnv_ {
    const struct JNINativeInterface_ *functions;
.
.
.
老实说,我不知道如何解决这个问题,因为我认为当您调用
System.loadLibrary(…)
时,java应该会解决这个问题。非常感谢您的帮助。

有两种可能:

<强> 1)您的C++代码从java调用为原生函数:< /强>

例如:

JNIEXPORT void JNICALL Java_MyJNative_doSomething(JNIEnv *env, jobject jo)
{
    std::cout << "doSomething() : ";
}

在Java中加载库时,JNI确保提供有效的
env
。您必须使用在本机函数调用中提供给您的JNI,它实际上是两者的混合体。java调用C++,将C++回调注册到一个事件中,其中一些java方法将被运行。但是正如你所说的,所有这些都是在C++内部创建的其他线程中完成的。这可能需要你所提出的附件?我想补充的是JVM首先运行,所以我认为我不能在C++中创建一个新的JVM,这将无济于事。我如何得到现有的JVM?如果线程是在java端创建的,C++所接收的Env是正确的。如果线程是用C++创建的,那么您确实需要将它们附加到JVM上。如果您没有jvm,您可以这样做:
JavaVM*jvm;env->GetJavaVM(&jvm)导出“代码< > JNEx销JNION加载(JavaVM*VM,VC++预留)< /Cord>一种获取JavaVM的方法,或者我最好从Env中获取Javavm并将其保存到一个类型为C++代码的< C++代码> Javavm < /Cord>?而且,我不能很好地理解这些C++线程如何不能访问全局保存的JNIENV指针的地址。堆是分开的还是别的什么?
JNIEnv *env;                // Pointer to native interface
jint rc = jvm->AttachCurrentThread ((void **)&env, nullptr);  // Attach without addutiobal parameters
                            // where jvm is a valid JavaVM*