我遇到一个问题,如何在 C 方法中回调java 方法,这个 c 方法不像 JNI 生成 c 方法。参数列表中不包括JNIEnv和JObject参数。如何解决它或其他解决方法....
问问题
469 次
2 回答
1
要从 C 程序执行 Java 方法,您需要先将 JVM 加载到 C 程序中。为此,您应该使用调用 API,请参阅http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/invocation.html
于 2013-06-25T09:39:56.143 回答
0
此方法将创建自己的 JNI_CreateJavaVM 方法并将其作为线程附加,然后在使用后立即释放它。
加载安装在您计算机中的 jvm.dll
TCHAR* dllpath = (char*)TEXT("C:\\Program Files\\Java\\jdk1.8.0_65\\jre\\bin\\server\\jvm.dll");
HMODULE jniModule = LoadLibrary(dllpath);
定义创建JVM的函数
typedef int (JNICALL * JNI_CreateJavaVM)(JavaVM** jvm, JNIEnv** env, JavaVMInitArgs* initargs);
JNI_CreateJavaVM createJavaVM = (JNI_CreateJavaVM)GetProcAddress(jniModule, "JNI_CreateJavaVM");
创建 JVM
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = const_cast<char*>("-Djava.class.path=" USER_CLASSPATH);
JavaVMInitArgs initArgs;
initArgs.version = JNI_VERSION_1_6;
initArgs.nOptions = 1;
initArgs.options = options;
JavaVM* jvm;
JNIEnv* env;
DWORD retval;
if ((retval = createJavaVM(&jvm, &env, &initArgs)) != JNI_OK){
cout << "beyond the scope of this answer" << endl;
return 1;
}
jint retvalue = jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
bool mustDetach = false;
如有必要,分离您的 JVM
if (retvalue == JNI_EDETACHED)
{
JavaVMAttachArgs args;
args.version = JNI_VERSION_1_6;
args.name = NULL;
args.group = NULL;
retvalue = jvm->AttachCurrentThread((void**)&env, &args);
mustDetach = true; // to clean up afterwards
}
指向方法所在的目标 Java 类
jclass clazz = env->FindClass("MyClazz");
指向java方法
jmethodID mid = env->GetStaticMethodID(clazz, "myJavaMethod", "()I");
调用java方法
int returnedValue = env->CallStaticintMethod(clazz, mid);
cout << "Returned value is " << returnedValue->size << endl;
这不会抛出对 JNI_CreateJavaVM 的未定义引用
于 2017-05-30T10:01:53.740 回答