如何避免 Java 调用 C++ 方法时的 UnsatisfiedLinkError 的问题

cnblogs 发布于 2011/08/01 09:54
阅读 1K+
收藏 0

我在一个 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.cpp
TestObject.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
}
加载中
0
ddatsh
ddatsh
库位置没放对?
0
Glogo
Glogo
很可能是库的设置不对的问题,我也遇到过这样的我problem
0
p
prostory
-Djava.libaray.path=<库目录>
返回顶部
顶部