Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数JNI_createJavaJVM中的JNI错误_Java_C++_Jvm_Java Native Interface - Fatal编程技术网

函数JNI_createJavaJVM中的JNI错误

函数JNI_createJavaJVM中的JNI错误,java,c++,jvm,java-native-interface,Java,C++,Jvm,Java Native Interface,我在实例化JVM时遇到了一些问题。如果我独立运行下面的代码,它可以正常工作。但是,我需要将它集成到一个更大的工具中,称为java库 程序首先调用createVM方法,然后调用invokePrismWrapper方法。但是,方法JNI_CreateJavaVM(…)返回JNI_ERR 预处理器 #define USER_CLASSPATH ".:../ .... CreateVM函数 JNIEnv* createVM (JavaVM **jvm) { JNIEnv *env;

我在实例化JVM时遇到了一些问题。如果我独立运行下面的代码,它可以正常工作。但是,我需要将它集成到一个更大的工具中,称为java库

程序首先调用createVM方法,然后调用invokePrismWrapper方法。但是,方法JNI_CreateJavaVM(…)返回JNI_ERR

预处理器

#define USER_CLASSPATH ".:../ ....
CreateVM函数

JNIEnv* createVM (JavaVM **jvm)
{
  JNIEnv *env;                       /* pointer to native method interface */
  JavaVMInitArgs vm_args;            /* JDK/JRE 6 VM initialization arguments */
  JavaVMOption* options = new JavaVMOption[1]; //holds various JVM optional settings
  options[0].optionString = const_cast<char*>("-Djava.class.path="USER_CLASSPATH);
  vm_args.version = JNI_VERSION_1_6;         //version of Java platform 
  vm_args.nOptions = 1;     
  vm_args.options = options;    
  vm_args.ignoreUnrecognized = false;   
  /* load and initialize a Java VM, return a JNI interface * pointer in env */
  long status = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);

  if (status == JNI_ERR){
    cout << "\n Unable to load JVM \n Exit";
    exit(-1);
  }

  delete options;
  return env;
}

非常感谢您的帮助。

那么导致此失败的较大程序有什么不同呢?
createVM
函数声明它返回指向
JNIEnv
的指针,但没有返回语句。你真的在运行这段代码吗?还是你修改了它?我忘了复制/粘贴return语句。我还使用为编译代码而编写的CMake脚本更新了主题@欧内斯特·弗里德曼·希尔:问题是,当我从大型软件调用createVM函数时,它会停止。当我把它作为一个独立的应用程序使用时,它执行得很好。两个EXE都是32位(或64位)?@doctorlove:64位。我可以作为独立应用程序运行这两个类(较大的软件和创建JVM并调用java类的绑定类)。但是,我无法从大型软件运行绑定类
float invokePrismWrapper(JavaVM **jvm, JNIEnv *env){
  jclass    mainClass       = env->FindClass(MainClass);    //Returns a class object from a fully-qualified name, or NULL if the class cannot be found.
  jmethodID classConstructor    = env->GetMethodID(mainClass, "<init>", "()V"); //Returns the method ID for an instance (nonstatic) method of a class 
  jobject   classObject     = env->NewObject(mainClass, classConstructor); //Constructs a new java object

  float outcome = 0;

  if (mainClass!=0){
   jmethodID methodid = env->GetMethodID(mainClass, "goPrism", "()Ljava/lang/String;");
   if (methodid!=0){
        jstring result = (jstring)env->CallObjectMethod(classObject, methodid); //returns the result of the calling method, an object 
        const jbyte *str = (jbyte *)(env)->GetStringUTFChars(result, NULL);  // Returns a pointer to an array of bytes representing the string in modified UTF-8 encoding
        outcome = ::atof((char*)str);
        env->ReleaseStringUTFChars(result, (char*)str);
        cout << "Result: " << outcome << endl;
   }
   else{
       cout << "Method not found!" << endl;
   }
    return outcome;
  }
  else{
    cout << "Class Not found" << endl;
    return -1;  
  }
}
cmake_minimum_required(VERSION 2.8.6)

FIND_PACKAGE(JNI REQUIRED)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/lib/jvm/java-6-openjdk-amd64/include -I/usr/lib/jvm/java-6-openjdk-amd64/include/linux -L/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server")

SET(CMAKE_EXE_LINKER_FLAGS "-ljvm")

# add the binary tree directory to the search path for include files
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${JNI_INCLUDE_DIRS})

ADD_LIBRARY(PRISMLibrary SHARED JNIWrapper.cpp)

message("JNI:- " ${JNI_LIBRARIES})
message("Source Dir: - " ${PROJECT_SOURCE_DIR})

TARGET_LINK_LIBRARIES (PRISMLibrary ${JNI_LIBRARIES})