从C代码创建JAVA类

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

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

编辑

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

编辑

我想我找到了一些有用的东西创建Java虚拟机 ,但我想知道必须要使用什么值#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  #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 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虚拟机时传递CLASSPATH的方式相同。 因此,如果你想创建一个com.fido.android.framework.service包中的类,你可以将生成的C可执行文件放在某个目录中,并将编译好的Java类放在com / fido / android / framework / service中子目录。 这样您就不需要更改CLASSPATH定义了

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

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