Java JNI与Builder C++;

Java JNI与Builder C++;,java,jvm,java-native-interface,c++builder,Java,Jvm,Java Native Interface,C++builder,我需要使用java本地接口(JNI)来在C++应用程序和java应用程序之间通信。 我首先从我的JVM.DLL生成我的JVM.Lib。为此,我使用了impdef和implib。我在我的项目生成器C++中添加了我的设置(包括路径和库路径)。 但是,我的程序生成 错误链接JNI_CreateJavaVM 如何修复此错误?如何在我的应用程序构建器C++中使用JNI? < P>我成功地修复了这个错误。我使用Coff2Omf命令来生成我的库 coff2omf jvm.lib jvm2.lib 之后,我添加

我需要使用java本地接口(JNI)来在C++应用程序和java应用程序之间通信。 我首先从我的
JVM.DLL
生成我的
JVM.Lib
。为此,我使用了
impdef
implib
。我在我的项目生成器C++中添加了我的设置(包括路径和库路径)。 但是,我的程序生成

错误链接JNI_CreateJavaVM


如何修复此错误?如何在我的应用程序构建器C++中使用JNI?

< P>我成功地修复了这个错误。我使用Coff2Omf命令来生成我的库

coff2omf jvm.lib jvm2.lib

之后,我添加了jvm2.lib并在设置中包含路径

这是一个C++调用代码的方法:java:< /p>

     #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;
        memset(&vm_args, 0, sizeof(vm_args));
        options.optionString = "-Djava.class.path=."; //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;

        HMODULE jvm_dll = LoadLibrary("C:\\Program Files (x86)\\Java\\jdk1.7.0_65\\jre\\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); 
        }

        int 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; }
        jclass cls;
        jmethodID mid;
        jint square;
        jboolean not;
        cls = (*env).FindClass("Sample2");

        if(cls !=0)
          {   mid = (*env).GetStaticMethodID(cls, "intMethod", "(I)I");
                if(mid !=0)
                {  square = (*env).CallStaticIntMethod(cls, mid, 5);
                   printf("Result of intMethod: %d\n", square);
                }

                mid = (*env).GetStaticMethodID(cls, "booleanMethod", "(Z)Z");
                if(mid !=0)
                {  not = (*env).CallStaticBooleanMethod( cls, mid, 1);
                   printf("Result of booleanMethod: %d\n", not);
                }
          }

        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选项;
memset(&vm_参数,0,sizeof(vm_参数));
options.optionString=“-Djava.class.path=。”;//java源代码的路径
vm_args.version=JNI_version_1_6;//JDK version。这表示版本1.6
vm_args.nOptions=1;
vm_args.options=&options;
vm_args.ignoreunrecogned=0;
hmodulejvm\u dll=LoadLibrary(“C:\\Program Files(x86)\\Java\\jdk1.7.0\u 65\\jre\\bin\\server\\jvm.dll”);
///您可以在LoadLibrary()之后检查GetLastError()
if(jvm_dll==NULL)
{ 
printf(“无法加载dll\n”);
出口(1);
}
JNI_CreateJavaVM_ptr=(JNI_CreateJavaVM_func)GetProcAddress(jvm_dll,“JNI_CreateJavaVM”);
///您可以在此处检查GetLastError()
if(JNI_CreateJavaVM_ptr==NULL)
{ 
printf(“无法加载函数\n”);
出口(1);
}
int ret=JNI_CreateJavaVM_ptr(jvm,(void**)&env和vm_args);
如果(ret<0)
{ 
printf(“\n无法启动JVM\n”);
}
返回环境;
}
int main(int argc,char*argv[])
{
JNIEnv*env;
JavaVM*jvm;
env=创建虚拟机(&jvm);
如果(env==NULL){return 1;}
jclass cls;
jmethodidemid;
金特广场;
jboolean不是;
cls=(*env.FindClass(“样本2”);
如果(cls!=0)
{mid=(*env).GetStaticMethodID(cls,“intMethod”,“I)I”);
如果(中间!=0)
{square=(*env).CallStaticIntMethod(cls,mid,5);
printf(“intMethod的结果:%d\n”,正方形);
}
mid=(*env.GetStaticMethodID(cls,“booleanMethod”,Z)Z);
如果(中间!=0)
{not=(*env).CallStaticBooleanMethod(cls,mid,1);
printf(“布尔方法的结果:%d\n”,不是);
}
}
int n=jvm->developmentjavavm();
返回0;
}

您是否可以添加更多关于过程中每个步骤的信息,以创建过程中的每个工件,并可能显示更有意义的错误上下文?C++Builder的IMPLIB创建OMF格式的文件。COFF2OMF仅在.lib文件采用COFF格式时才起作用,例如,如果将.lib文件用于VisualStudio而不是C++Builder。直接实现DLL的全部目的是避免这样做。