gpt4 book ai didi

java - 从 C 代码创建 JAVA 类

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

我在 Java 中有一个名为 XMLDOMDocument 的类,这个类有一些方法 CreateXMLAddNodeRemoveNode 等。我在 Java Native Interface 的帮助下从 C 代码调用此方法,但为此我传递给我的 JAVA 类的 C 代码对象,然后通过调用 env->GetObjectClass(myclass) 我得到了我的从该对象创建类并调用 JAVA 类的方法。

我想知道我是否可以在不将我的类传递给 C 代码的情况下做同样的事情(调用 JAVA 方法)。我可以直接在 C 代码中创建 JAVA 类,然后调用它的方法吗?

已编辑

如果我的 C 代码中有 JavaVM,我能否借助该 Java VM 在 C 代码中创建一个新的 JAVA 类实例。

已编辑

我想我找到了一些有用的东西 Creating the Java Virtual Machine ,但我想了解必须确定什么值 #define USER_CLASSPATH ?如果那必须是包名 com.fido.android.framework.service

public class Prog {
public static void main(String[] args) {
System.out.println("Hello World " + args[0]);
}
}

#include <jni.h>

#define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
#define USER_CLASSPATH "." /* where Prog.class is */

main() {
JNIEnv *env;
JavaVM *jvm;
jint res;
jclass cls;
jmethodID mid;
jstring jstr;
jclass stringClass;
jobjectArray args;

#ifdef JNI_VERSION_1_2
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString =
"-Djava.class.path=" USER_CLASSPATH;
vm_args.version = 0x00010002;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_TRUE;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
#else
JDK1_1InitArgs vm_args;
char classpath[1024];
vm_args.version = 0x00010001;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
/* Append USER_CLASSPATH to the default system class path */
sprintf(classpath, "%s%c%s",
vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
vm_args.classpath = classpath;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, &env, &vm_args);
#endif /* JNI_VERSION_1_2 */

if (res < 0) {
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
cls = (*env)->FindClass(env, "Prog");
if (cls == NULL) {
goto destroy;
}

mid = (*env)->GetStaticMethodID(env, cls, "main",
"([Ljava/lang/String;)V");
if (mid == NULL) {
goto destroy;
}
jstr = (*env)->NewStringUTF(env, " from C!");
if (jstr == NULL) {
goto destroy;
}
stringClass = (*env)->FindClass(env, "java/lang/String");
args = (*env)->NewObjectArray(env, 1, stringClass, jstr);
if (args == NULL) {
goto destroy;
}
(*env)->CallStaticVoidMethod(env, cls, mid, args);

destroy:
if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionDescribe(env);
}
(*jvm)->DestroyJavaVM(jvm);
}

我还想知道将类对象从 java 传递到 C 和直接在 C 中创建 java 类之间的区别

最佳答案

CLASSPATH 的定义方式应与启动 Java 虚拟机时传递它的方式相同。因此,如果您想在 com.fido.android.framework.service 包中创建一个类,您可以将生成的 C 可执行文件放在某个目录中,并将编译后的 Java 类放在 com/fido/android/framework/service 中子目录。这样你就不需要改变 CLASSPATH 定义

应在 FindClass 调用中传递包名称:

cls = (*env)->FindClass(env, "com/fido/android/framework/service/Prog");

关于java - 从 C 代码创建 JAVA 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10877529/

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