java - 使用 jni.h 在 C++ 中编译 java 方法时生成错误

标签 java c++ compilation

我正在尝试从 Visual Studio C++ 环境中的 Java 类运行一些方法。我收到与 CreateJavaVM 相关的错误。

你能帮我找到解决方案吗?

我做了以下步骤。

第一步:JDK 1.6安装在以下路径下:C:\Program Files\Java 有以下2个子目录:jdk1.6.0_45、jre6

第 2 步:编写一个简单的 java 程序。

public class Sample2
{
   public static int intMethod(int n)
   {
     return n*n;
   }
   public static boolean booleanMethod(boolean bool) 
   {
    return !bool;
    }
 }

第三步:编译java代码:

   javac Sample2.java

第 4 步:创建一个 Visual Studio C++ 程序。 Visual C++ CLR 控制台应用程序。

第 5 步: 添加其他依赖项。 (jvm.lib 和 jvm.dll) a) 选择项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项:jvm.lib b) 选择项目 -> Properties -> Linker -> Input -> Delay Loaded Dlls: jvm.dll

第 6 步: 添加包含目录 a) 选择project -> Properties -> Configuration Properties -> C/C++ -> General -> Additional Include Directories: C:\Program Files\Java\jdk1.6.0_45\lib; C:\Program Files\Java\jdk1.6.0_45\include\win32; C:\Program Files\Java\jdk1.6.0_45\include

第 7 步: 编写 C++ 代码以运行 java 方法。

  #include "stdafx.h"
  #include "jni.h"
  #include <jni_md.h>
  using namespace System;

  int main(array<System::String ^> ^args)
  {

    JavaVM *jvm;   /* denotes a Java VM */
    JNIEnv *env;  /* pointer to native method interface */
    jint square;
    jboolean not;

    JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */

    JavaVMOption *options = new JavaVMOption[1];

    options[0].optionString = "-Djava.class.path=C:\\JavaCode";  

   vm_args.version = JNI_VERSION_1_6;
   vm_args.options = options;
   vm_args.nOptions = 1;
   vm_args.ignoreUnrecognized = false;

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

   jclass cls = env->FindClass("Sample2");

   jmethodID mid = env->GetStaticMethodID(cls, "staticInt", "(I)I");

   env->CallStaticVoidMethod(cls, mid,10);

   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);
    }
 }

 jvm->DestroyJavaVM();

 Console::Read();
 return 0;
}

第 8 步:当我构建项目时出现以下错误:

1>------ Build started: Project: 1, Configuration: Debug Win32 ------

1>LINK : warning LNK4199: /DELAYLOAD:jvm.dll ignored; no imports found from jvm.dll

1>1.obj : warning LNK4248: unresolved typeref token (0100000F) for '_jmethodID'; image may not run

1>1.obj : error LNK2028: unresolved token (0A000016) "extern "C" long __stdcall JNI_CreateJavaVM(struct JavaVM_ * *,void * *,void *)" (?JNI_CreateJavaVM@@$$J212YGJPAPAUJavaVM_@@PAPAXPAX@Z) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)

1>1.obj : error LNK2019: unresolved external symbol "extern "C" long __stdcall JNI_CreateJavaVM(struct JavaVM_ * *,void * *,void *)" (?JNI_CreateJavaVM@@$$J212YGJPAPAUJavaVM_@@PAPAXPAX@Z) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)

1>C:\Users\tveluppillai\Desktop\Test1\1\Debug\1.exe : fatal error LNK1120: 2 unresolved externals

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

有人可以帮我解决这个错误吗?

最佳答案

JNI_CreateJavaVMjni.h 中定义,所以我猜你的链接器没有找到 jni.h .我实际上把那个文件和jni_md.h在我的项目目录中包含我的源代码。

请注意 jni.h包括 jni_md.h , 所以有 #include <jni_md.h>在您的源代码中是多余的。

关于java - 使用 jni.h 在 C++ 中编译 java 方法时生成错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29806094/

相关文章:

c++ - 从 vector 中的 vector 中删除类的实例

c++ - 如何在 QT 中的自定义视频小部件 t 上绘制矩形?

java - Do While 循环跳过用户输入

java - 为什么创建 GridBagConstraints 的内联版本不起作用?

java - java中如何获取项目名称?

java - 无法 <jsp :include> within sitemesh <decorator:body/>

c++ - 如何使用 boost::thread 调用重载函数?

compilation - Chapel如何处理 "includes"

c++ - 应该如何设置王朝?

javascript - 为什么JS是解释型的而不是编译型的?