初始化JNI_CreateJavaVM的第三个参数

初始化JNI_CreateJavaVM的第三个参数,java,java-native-interface,Java,Java Native Interface,方法JNI_CreateJavaVM的第三个参数将第三个参数作为JavaVMInitArgs结构 typedef struct JavaVMInitArgs { jint version; jint nOptions; JavaVMOption *options; jboolean ignoreUnrecognized;

方法
JNI_CreateJavaVM
的第三个参数将第三个参数作为
JavaVMInitArgs
结构

typedef struct JavaVMInitArgs { 
                     jint version; 
                     jint nOptions; 
                     JavaVMOption *options; 
                     jboolean ignoreUnrecognized; 
                 } JavaVMInitArgs;
我如何初始化它?我不能这样做

JNI_CreateJavaVM的原型
jint JNI_CreateJavaVM(JavaVM**pvm,void**penv,
void*vm_参数)

如何初始化vm_参数?

经过讨论,我们得出结论,您的编译器设置存在问题

为了能够成功编译和链接
JNI_CreateJavaVM
,您需要将
jvm
库添加到链接器中


初步答复: 查看以下示例可能会解释您需要执行的操作:

JavaVMInitArgs vm_args;
JavaVMOption options[4];

options[0].optionString = "-Djava.compiler=NONE";           /* disable JIT */
options[1].optionString = "-Djava.class.path=c:\myclasses"; /* user classes */
options[2].optionString = "-Djava.library.path=c:\mylibs";  /* set native library path */
options[3].optionString = "-verbose:jni";                   /* print JNI-related messages */

vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = 4;
vm_args.ignoreUnrecognized = TRUE;

/* Note that in the JDK, there is no longer any need to call 
 * JNI_GetDefaultJavaVMInitArgs. 
 */
res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
if (res < 0) ...
JavaVMInitArgs vm_args;
JavaVMOption选项[4];
选项[0]。选项字符串=“-Djava.compiler=NONE”;/*禁用JIT*/
选项[1]。选项字符串=“-Djava.class.path=c:\myclasses”;/*用户类*/
选项[2]。选项字符串=“-Djava.library.path=c:\mylibs”/*设置本机库路径*/
选项[3]。选项字符串=“-verbose:jni”;/*打印与JNI相关的消息*/
vm_args.version=JNI_version_1_2;
vm_args.options=选项;
vm_args.nOptions=4;
vm_args.ignoreunrecogned=TRUE;
/*注意,在JDK中,不再需要调用
*JNI_GetDefaultJavaVMInitArgs。
*/
res=JNI_CreateJavaVM(&vm,(void**)&env,&vm_args);
如果(res<0)。。。
经过讨论,我们得出结论,您的编译器设置存在问题

为了能够成功编译和链接
JNI_CreateJavaVM
,您需要将
jvm
库添加到链接器中


初步答复: 查看以下示例可能会解释您需要执行的操作:

JavaVMInitArgs vm_args;
JavaVMOption options[4];

options[0].optionString = "-Djava.compiler=NONE";           /* disable JIT */
options[1].optionString = "-Djava.class.path=c:\myclasses"; /* user classes */
options[2].optionString = "-Djava.library.path=c:\mylibs";  /* set native library path */
options[3].optionString = "-verbose:jni";                   /* print JNI-related messages */

vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = 4;
vm_args.ignoreUnrecognized = TRUE;

/* Note that in the JDK, there is no longer any need to call 
 * JNI_GetDefaultJavaVMInitArgs. 
 */
res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
if (res < 0) ...
JavaVMInitArgs vm_args;
JavaVMOption选项[4];
选项[0]。选项字符串=“-Djava.compiler=NONE”;/*禁用JIT*/
选项[1]。选项字符串=“-Djava.class.path=c:\myclasses”;/*用户类*/
选项[2]。选项字符串=“-Djava.library.path=c:\mylibs”/*设置本机库路径*/
选项[3]。选项字符串=“-verbose:jni”;/*打印与JNI相关的消息*/
vm_args.version=JNI_version_1_2;
vm_args.options=选项;
vm_args.nOptions=4;
vm_args.ignoreunrecogned=TRUE;
/*注意,在JDK中,不再需要调用
*JNI_GetDefaultJavaVMInitArgs。
*/
res=JNI_CreateJavaVM(&vm,(void**)&env,&vm_args);
如果(res<0)。。。

W:\elita\jnitests\workspace\c\MyHook\MyHook.c | 57 |对_imp | u JNI的未定义引用_CreateJavaVM@12“|
我认为您的include目录设置不正确(请检查您是否同时包含
jdk/include
jdk/include/
)。我应该在哪里包含它们?您的编译器选项,在检查选项的同时,还要检查是否为链接器设置了库路径和
-D_JNI_实现
变量。我已经以同样的方式运行了一个月的JNI程序。你为什么认为有一个包含问题?说
W:\elita\jnitests\workspace\c\MyHook\MyHook.c | 57 |未定义对_imp_JNI的引用_CreateJavaVM@12“|
我认为您的include目录设置不正确(请检查您是否同时包含
jdk/include
jdk/include/
)。我应该在哪里包含它们?您的编译器选项,在检查选项的同时,还要检查是否为链接器设置了库路径和
-D_JNI_实现
变量。我已经以同样的方式运行了一个月的JNI程序。你为什么认为有一个包含问题?