如何使用自定义Object类为JNI方法定义返回类型?

时间:2010-11-23 18:36:51

标签: java c++ c java-native-interface

我在JNI(C ++)中有一个方法,我希望能够返回一个自定义的Object类型(不是原语或String等...) 我写了一些东西,但我不断收到java.lang.UnsatisfiedLinkError错误。

以下是详细信息:

方法:

static jobject Java_android_sdk_Core_ProcessFrame(JNIEnv *env, jobject myobj, jbyteArray frameData)
    {

     jclass clazz;
     jmethodID cid;
     jobject jCoreOut;
     static const char* const strClassName = "android/sdk/Core/CoreOutput";
     clazz = env->FindClass(strClassName);
     if (clazz == NULL) {
      LOGE("Can't find class CoreOutput");

     }
     cid = env->GetMethodID(clazz,"<init>", "()V");
     jCoreOut = env->NewObject(clazz, cid);


     // Free local references 
        env->DeleteLocalRef(clazz);

     return jCoreOut;

    }

我有以下列方式定义的方法描述符:

    static const JNINativeMethod gMethods[] = {
        { "CreateCore", "(III)V", (void*) Java_android_sdk_Core_CreateCore },
  { "ProcessFrame", "([B)Landroid/sdk/Core/CoreOutput;", (void*) Java_android_sdk_Core_ProcessFrame }
 };

我正在通过调用以下方式执行方法注册:

     if (env->RegisterNatives(clazz, gMethods,
    sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK)
 {
  LOGE("Failed registering JNI methods");
  return result;
 }

我的其他原生方法的注册成功。 (我可以使用它们......)

当我尝试调用ProcessFrame方法时,我从Logcat获得以下输出:

11-23 16:10:10.139: ERROR/AndroidRuntime(4923): java.lang.UnsatisfiedLinkError: ProcessFrame

我确信这与我没有正确定义方法有关。任何人都可以对此有所了解吗?

有人能指出一个很好的教程,其中涵盖的不仅仅是处理JNI中的原始类型吗?

谢谢,

伊塔马尔

1 个答案:

答案 0 :(得分:1)

当JVM找不到该方法时,抛出UnsatisfiedLinkError。所以它与您的方法声明有关。查看javah为您创建函数头。请看一下:javah