如何避免 Java 调用 C++ 方法时的 UnsatisfiedLinkError 的问题
我在一个 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 }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
-Djava.libaray.path=<库目录>
很可能是库的设置不对的问题,我也遇到过这样的我problem
库位置没放对?