0

我遇到一个问题,如何在 C 方法中回调java 方法,这个 c 方法不像 JNI 生成 c 方法。参数列表中不包括JNIEnvJObject参数。如何解决它或其他解决方法....

4

2 回答 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 回答