我在一个 C++ 的应用中嵌入了 Java,我需要将一些 C++ 的方法提供给 Java 调用,同时还有在 C++ 中调用 Java 的方法,相当于是两种语言的互相调用。
我是否需要将 Java 要调用的 C++ 方法封装到共享库中呢?
我试验了很多代码,但老是报 java.lang.UnsatisfiedLinkError 错误
下面是我在 OS X 10.5 上的编译命令:
g++ -Wall -I/System/Library/Frameworks/JavaVM.framework/Headers/ -framework JavaVM -g test.cppTestObject.java
// To build this you need to do a `javac TestObject.java` // To get the signatures do a `javap -d TestObject` // To generate the .h file do a `javah TestObject` public class TestObject { public native TestObject get_property( String k ); }
test.cpp
#include <jni.h> #include <assert.h> int main() { JavaVM* jvm; JavaVMInitArgs vm_args; JavaVMOption options[1]; vm_args.version = JNI_VERSION_1_4; vm_args.nOptions = 1; options[0].optionString = "-Djava.class.path=."; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_FALSE; JNIEnv * env; JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args); jclass klass = (env)->FindClass("TestObject"); assert( klass ); jmethodID constructor = env->GetMethodID( klass, "<init>", "()V"); assert( constructor ); jobject obj = env->NewObject(klass, constructor ); jmethodID test_method = (env)->GetMethodID( klass, "get_property", "(Ljava/lang/String;)LTestObject;" ); assert( test_method ); jvalue args[1]; args[0].l = env->NewStringUTF("k"); jobject rv = env->CallObjectMethodA(obj, test_method, args ); jthrowable exc = env->ExceptionOccurred(); if(exc) { env->ExceptionDescribe(); env->ExceptionClear(); } //TODO: do something with rv }