Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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_CreateJavaVM在64位C中失败_Java_C_Linker_Java Native Interface_Libraries - Fatal编程技术网

JNI_CreateJavaVM在64位C中失败

JNI_CreateJavaVM在64位C中失败,java,c,linker,java-native-interface,libraries,Java,C,Linker,Java Native Interface,Libraries,我遇到了与类似的问题,只是我的代码在32位编译时运行,但在64位编译时失败。我正在使用Windows SDK 7.1平台更改Visual Studio Express 2010中每个配置的JDK位置。我的建议包括: C:\Program Files\Java\jdk1.6.0_29\include; (for jni.h) C:\Program Files\Java\jdk1.6.0_29\include\win32; (for jni_md.h) 我的其他图书馆包括: C:\Program

我遇到了与类似的问题,只是我的代码在32位编译时运行,但在64位编译时失败。我正在使用Windows SDK 7.1平台更改Visual Studio Express 2010中每个配置的JDK位置。我的建议包括:

C:\Program Files\Java\jdk1.6.0_29\include; (for jni.h)
C:\Program Files\Java\jdk1.6.0_29\include\win32; (for jni_md.h)
我的其他图书馆包括:

C:\Program Files\Java\jdk1.6.0_29\lib; (for jvm.lib and jawt.lib)
我的源代码只是尝试在C中初始化JVM,然后无限循环以确保命令提示符在VSC++中保持打开状态

#include "stdafx.h"
#include "jni.h"

JNIEnv* create_vm(JavaVM ** jvm);

int i;
JavaVM* jvm;
JNIEnv * env;

int _tmain(int argc, _TCHAR* argv[])
{
    printf("Hello World!");
    env = create_vm(&jvm);

    if (env == 0) { return 7; }

    i = 0;

    while (1) { i++; }

    return 0;
}

JNIEnv* create_vm(JavaVM ** jvm) {

    JavaVMInitArgs vm_args;
    int ret;
    JavaVMOption options;

    //Path to the java source code
    options.optionString = "-Djava.class.path=H:\\jarpath\\jarfile.jar";
    vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
    vm_args.nOptions = 1;
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = 0;

    ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);

    if(ret < 0)
        printf("\nUnable to Launch JVM\n");
    return env;
}
代码在VSC++控制台窗口中退出,并出现以下错误:

The program '[5684] JNI_Test.exe: Native' has exited with code 1 (0x1).
在库或基本C代码方面,我缺少什么吗?我已经有一段时间没有用C编写代码了,首先我对整个库链接不是很熟悉。

试试这段代码(它不使用export.lib文件,只需要JNI头和JVM.dll)。我已经使用了命令

gcc -m64 -o test.exe small_test.cpp -I "C:\Program Files\Java\jdk1.6.0_25\include" -I "C:\Program Files\Java\jdk1.6.0_25\include\win32" -lstdc++
编译它(MinGW,但VC++也应该可以工作。MinGW使用旧的MSVCRT)

检查GetLastError()。我怀疑64位C运行时有问题

#include <windows.h>
#include <stdio.h>
#include <jni.h>
#include <string.h>

#define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
#define USER_CLASSPATH "." /* where Prog.class is */

typedef /*_JNI_IMPORT_OR_EXPORT_*/ jint (JNICALL *JNI_CreateJavaVM_func)(JavaVM **pvm, void **penv, void *args);

JNI_CreateJavaVM_func JNI_CreateJavaVM_ptr;

JNIEnv* create_vm(JavaVM ** jvm)
{
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options;
    HMODULE jvm_dll;
    int ret;

    options.optionString = "-Djava.class.path=D:\\monotest\\src_CJNIJava\\bin"; //Path to the java source code
    vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
    vm_args.nOptions = 1;
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = 0;

    jvm_dll = LoadLibrary("C:\\Program Files\\Java\\jre6\\bin\\server\\jvm.dll");

    /// You might check the GetLastError() here after the LoadLibrary()
    if(jvm_dll == NULL) { printf("can't load dll\n"); exit(1); }

    JNI_CreateJavaVM_ptr = (JNI_CreateJavaVM_func)GetProcAddress(jvm_dll, "JNI_CreateJavaVM");

    /// You might check the GetLastError() here
    if(JNI_CreateJavaVM_ptr == NULL) { printf("can't load function\n"); exit(1); }

    ret = JNI_CreateJavaVM_ptr(jvm, (void**)&env, &vm_args);
    if(ret < 0) { printf("\nUnable to Launch JVM\n"); }
    return env;
}

int main(int argc, char* argv[])
{
    JNIEnv *env;
    JavaVM * jvm;
    env = create_vm(&jvm);

    if (env == NULL) { return 1; }

    int n = jvm->DestroyJavaVM();
    return 0;
}
#包括
#包括
#包括
#包括
#定义路径_分隔符“;”/*在Solaris上将其定义为“:”*/
#定义用户_CLASSPATH”“/*其中Prog.class是*/
typedef/*\u JNI\u IMPORT\u或\u EXPORT\u*/jint(JNICALL*JNI\u CreateJavaVM\u func)(JavaVM**pvm,void**penv,void*args);
JNI_CreateJavaVM_func JNI_CreateJavaVM_ptr;
JNIEnv*创建虚拟机(JavaVM**jvm)
{
JNIEnv*env;
JavaVMInitArgs vm_args;
JavaVMOption选项;
hmodulejvm_dll;
int ret;
options.optionString=“-Djava.class.path=D:\\monotest\\src\u CJNIJava\\bin”;//java源代码的路径
vm_args.version=JNI_version_1_6;//JDK version。这表示版本1.6
vm_args.nOptions=1;
vm_args.options=&options;
vm_args.ignoreunrecogned=0;
jvm_dll=LoadLibrary(“C:\\Program Files\\Java\\jre6\\bin\\server\\jvm.dll”);
///您可以在LoadLibrary()之后检查GetLastError()
如果(jvm_dll==NULL){printf(“无法加载dll”);退出(1);}
JNI_CreateJavaVM_ptr=(JNI_CreateJavaVM_func)GetProcAddress(jvm_dll,“JNI_CreateJavaVM”);
///您可以在此处检查GetLastError()
如果(JNI_CreateJavaVM_ptr==NULL){printf(“无法加载函数”);退出(1);}
ret=JNI_CreateJavaVM_ptr(jvm,(void**)&env和vm_args);
if(ret<0){printf(“\n无法启动JVM\n”);}
返回环境;
}
int main(int argc,char*argv[])
{
JNIEnv*env;
JavaVM*jvm;
env=创建虚拟机(&jvm);
如果(env==NULL){return 1;}
int n=jvm->developmentjavavm();
返回0;
}

感谢您的快速回复。现在,我得到了一些与“HMODULE”typedef相关的其他错误。具体来说,
JNI_Test.c(24):错误C2275:“HMODULE”:非法使用此类型作为表达式。
任何指针?句柄正常,而不是HMODULEOooh。。。抱歉,这是C。只需将“HMODULE jvm\u dll”稍微移到create\u vm()的开头。与“intret”相同。您也可以将“JNI_Test.c”重命名为“JNI_Test.cpp”。最初我提到了“.cpp”扩展名。C89在变量定义方面“较弱”。编辑::刚刚看到您的更新。是的,很好!非常感谢!::实际上,我需要更改一行,因为我是纯C而不是C++(声明函数<代码> HMULTJVMYDLL< /COD>和 /COD>函数外)。但是JVM一开始就没有问题。我确实收到一个错误,关于
jvm
不是
DestroyJavaVM
方法的结构或联合,但这可能与我之前的问题无关。再次感谢!
#include <windows.h>
#include <stdio.h>
#include <jni.h>
#include <string.h>

#define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
#define USER_CLASSPATH "." /* where Prog.class is */

typedef /*_JNI_IMPORT_OR_EXPORT_*/ jint (JNICALL *JNI_CreateJavaVM_func)(JavaVM **pvm, void **penv, void *args);

JNI_CreateJavaVM_func JNI_CreateJavaVM_ptr;

JNIEnv* create_vm(JavaVM ** jvm)
{
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options;
    HMODULE jvm_dll;
    int ret;

    options.optionString = "-Djava.class.path=D:\\monotest\\src_CJNIJava\\bin"; //Path to the java source code
    vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
    vm_args.nOptions = 1;
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = 0;

    jvm_dll = LoadLibrary("C:\\Program Files\\Java\\jre6\\bin\\server\\jvm.dll");

    /// You might check the GetLastError() here after the LoadLibrary()
    if(jvm_dll == NULL) { printf("can't load dll\n"); exit(1); }

    JNI_CreateJavaVM_ptr = (JNI_CreateJavaVM_func)GetProcAddress(jvm_dll, "JNI_CreateJavaVM");

    /// You might check the GetLastError() here
    if(JNI_CreateJavaVM_ptr == NULL) { printf("can't load function\n"); exit(1); }

    ret = JNI_CreateJavaVM_ptr(jvm, (void**)&env, &vm_args);
    if(ret < 0) { printf("\nUnable to Launch JVM\n"); }
    return env;
}

int main(int argc, char* argv[])
{
    JNIEnv *env;
    JavaVM * jvm;
    env = create_vm(&jvm);

    if (env == NULL) { return 1; }

    int n = jvm->DestroyJavaVM();
    return 0;
}