gpt4 book ai didi

java - 无法使用 JNI 使用外部 Java 类

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:36 25 4
gpt4 key购买 nike

我在通过 JNI 使用外部 Java 类时遇到问题。我将用一个玩具示例来说明我的问题。

这是我的 Java 类,例如使用 Apache Commons IO 的外部类 FilenameUtils:

示例.java

import org.apache.commons.io.FilenameUtils;

class Example {

static void base () {

String str = "/usr/foo.bar";
System.out.println("Before");
try {
System.out.println(FilenameUtils.getBaseName(str));
}
catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("After");
}

public static void main(String[] args) {
base();
}
}

我的类路径是用 $CLASSPATH 设置的:

export CLASSPATH=".:/Applications/eclipse/plugins/*"

我是用javac编译的,然后执行。这是我得到的输出,这是正确的:

Before
foo
After

当我使用 JNI 从 C++ 调用 Java 方法“base”时,问题就出现了。这是 C++ 代码:

测试.cpp

#include <jni.h>
#include <cstring>

int main()
{
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
jclass cls;
jmethodID method;
jobject simpleJNITestInstance;

options[0].optionString = "-Djava.class.path=.:/Applications/eclipse/plugins/*";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;

long status = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
if (status != JNI_ERR)
{
cls = env->FindClass("Example");
if (cls != 0)
{
method = env->GetStaticMethodID(cls, "base", "()V");
env->CallStaticVoidMethod(cls, method, 5);
}
jvm->DestroyJavaVM();
}
printf("Finished\n");
return 0;
}

虽然我认为在我的情况下没有必要,因为它已经配置了 $CLASSPATH,但我在 VM 选项中再次指定了类路径。我还向 CallStaticVoidMethod 函数添加了一个参数 5,因为我不知道如何指定零参数。 Java 方法不接收任何参数,因此将被忽略。

然后我编译这个 C++ 代码:

g++  -o test \
-I/Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/include \
-I/Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/include/darwin \
-L/Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/jre/lib/server/ \
test.cpp \
-ljvm

并执行这个编译好的程序。这是我现在得到的输出:

Before
Finished

当它访问 getBaseName 方法时,方法“base”的执行就停止了。没有引发异常,它只是停止执行,并返回到 native 代码。

为什么无法执行FilenameUtils.getBaseName()方法?

我的机器运行的是 Mac OS 10.10 Yosemite,Java 1.7.0.72 64 位。

提前致谢。

更新

我尝试将 commons-io-2.4.jar 直接包含在类路径中,现在程序可以运行了:

    options[0].optionString = "-Djava.class.path=.:/Applications/eclipse/plugins/commons-io-2.4/commons-io-2.4.jar";

现在我的问题是,为什么类路径在使用 JNI 时表现不同?

最佳答案

所以问题很简单。使用 $CLASSPATH 或 -cp 指定类路径时,可以使用通配符。

但是如果类路径设置为“-Djava.class.path”通配符不起作用,则必须单独指定 jar 和目录列表。

此外,“-Djava.class.path”覆盖 $CLASSPATH。

关于java - 无法使用 JNI 使用外部 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com