gpt4 book ai didi

java - C + JNI : CallStaticCharMethod causes error

转载 作者:行者123 更新时间:2023-11-30 15:01:21 25 4
gpt4 key购买 nike

我正在尝试将 Java 和 C 程序与 JNI 结合起来。我的目标是将字符串从 JNI 传递到 C。调用 CallStaticCharMethod 时出现错误(段错误?)。我有一种感觉,我真的错过了如何做到这一点的重点。我错过了什么?

我修改的例子来自here .

helloWorld.java

public class helloWorld{
public static void main(String[] args){
System.out.println("Hello, World");
}
public static char hello(){
String s = "H";
char c = s.charAt( 0 );
return c;
}
}

hello_world.c

JNIEnv *create_vm(JavaVM **jvm) {
JNIEnv *env;
JavaVMInitArgs args;
JavaVMOption options;
args.version = JNI_VERSION_1_6;
args.nOptions = 1;
options.optionString = "-Djava.class.path=./";
args.options = &options;
args.ignoreUnrecognized = 0;
int rv;
rv = JNI_CreateJavaVM(jvm, (void **) &env, &args);
if (rv < 0 || !env)
printf("Unable to Launch JVM %d\n", rv);
else
printf("Launched JVM! :)\n");
return env;
}

void invoke_class(JNIEnv *env) {
jclass hello_world_class;
jmethodID main_method;
jmethodID hello_method;
jint number = 20;
jint exponent = 3;
hello_method = (*env)->GetStaticMethodID(env, hello_world_class, "hello", "()C");

//This line causes the error:
(*env)->CallStaticCharMethod(env, hello_world_class, hello_method);
}
int main(int argc, char **argv) {
JavaVM *jvm;
JNIEnv *env;
env = create_vm(&jvm);
if (env == NULL)
return 1;
invoke_class(env);
return 0;
}

编辑 1

这在错误日志中:

# Problematic frame:
# V [libjvm.so+0x6f112a]
JNI_ArgumentPusherVaArg::JNI_ArgumentPusherVaArg(_jmethodID*, _va_list_tag*)+0xa

最佳答案

您需要按照上面评论者的建议初始化hello_world_class。请注意,hello_world_class 不是 helloWorld 类的实例。它是对类的引用——这意味着对类型的引用。您的 C 代码只知道方法名称,但不知道类名称。方法 hello 可以在很多类中定义,C 代码必须知道它是什么类:

hello_world_class = (*env)->FindClass(env, "helloWorld");
hello_method = (*env)->GetStaticMethodID(env, hello_world_class, "hello", "()C");

在这种情况下没有必要有全局引用。简单的 FindClass 就足够了。

关于java - C + JNI : CallStaticCharMethod causes error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41502097/

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