gpt4 book ai didi

java - JNI C 反射拼图

转载 作者:行者123 更新时间:2023-12-04 07:14:43 25 4
gpt4 key购买 nike

下面的所有代码都按预期工作,除了崩溃的指示行。
我花了几天的时间在这段代码上摸索,检查并重新检查文档。如果有人能指出我遗漏的无疑是显而易见的事情,我会很高兴。
主.java:

public class Main {
public static void main(String[] args) {
Test tst = new Test();
System.out.println((String)tst.test());
}
}
测试.java
public class Test {
static { System.loadLibrary("test"); }
public native Object test();
}
测试.c
#include <jni.h>
JNIEXPORT jobject JNICALL Java_Test_test(JNIEnv *env, jobject thiz) {
const char* out = "success";
do {
jclass cls_cls = (*env)->FindClass(env, "java/lang/Class");
if ( !cls_cls ) { out = "FindClass"; break; }
jmethodID mfn = (*env)->GetStaticMethodID(
env, cls_cls, "forName", "(Ljava/lang/String;)Ljava/lang/Class;"
);
if ( !mfn ) { out = "GetStaticMethodID"; break; }
// **** lines above succeed, line below segfaults ****
jclass cls = (jclass) (*env)->CallStaticObjectMethod(
env, cls_cls, mfn, "java.lang.String"
);
if ( (*env)->ExceptionCheck(env) ) { out = "CallStaticObjectMethod"; break; }
} while ( 0 );
(*env)->ExceptionClear(env);
return (jobject) (*env)->NewStringUTF(env, out);
}
编译/执行
gcc -D_REENTRANT -fPIC -Wall -c test.c -o test.o -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux
gcc -D_REENTRANT -fPIC -Wall -shared -o libtest.so -O test.o
javac -Xlint:all Main.java
java -Xcheck:jni -Djava.library.path=. Main
预期结果,用纯 Java 表示:
Class<?> cls_cls = Class.class;
Method mfn = cls_cls.getDeclaredMethod("forName", String.class);
Class<?> cls = (Class) mfn.invoke(null, "java.lang.String");

最佳答案

调用 Class.forName方法你应该传递一个 java.lang.String对它来说,不是原始的 const char* .
要从 C 字符串中获取 Java 字符串,请使用 NewStringUTF功能:

jstring arg = (*env)->NewStringUTF(env, "java.lang.String");
jclass cls = (jclass) (*env)->CallStaticObjectMethod(
env, cls_cls, mfn, arg
);
然后是来自 Main.java 的 java 代码将打印:
success

关于java - JNI C 反射拼图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68836122/

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