【问题标题】:JNI with Builder C++JNI 与 Builder C++
【发布时间】:2014-07-18 22:33:03
【问题描述】:

我需要使用 Java 本机接口 (JNI) 在我的 C++ 应用程序和我的 Java 应用程序之间进行通信。

我从我的JVM.DLL 生成我的JVM.Lib 开始。为此,我使用了impdefimplib。我在我的项目 Builder C++ 中添加我的设置(包括路径和库路径)。

但是,我的程序生成

错误链接 JNI_CreateJavaVM。

如何解决此错误?如何在我的应用程序 Builder C++ 中使用 JNI?

【问题讨论】:

  • 您能否在过程中添加更多关于创建每个工件的每个步骤的信息,并可能显示更有意义的错误上下文?

标签: java jvm java-native-interface c++builder


【解决方案1】:

我成功修复了这个错误。我使用 Coff2Omf 命令生成我的库

coff2omf jvm.lib jvm2.lib

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

这是调用方法 java 的示例 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;
        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;
    }

【讨论】:

  • C++Builder 的 IMPLIB 创建 OMF 格式的文件。 COFF2OMF 仅在您的 .lib 文件为 COFF 格式时才有效,例如,如果您为 VisualStudio 使用 .lib 文件而不是 C++Builder。直接 IMPLIB'ing DLL 的全部意义在于避免这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2014-10-22
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多