2010-11-23 75 views
3

我在JNI(C++)中有一个方法,我希望能够返回一个自定义的对象类型(不是原始类型或字符串等)。 我已经写了一些东西,但我不断得到java.lang。 UnsatisfiedLinkError错误。如何使用自定义Object类为JNI方法定义返回类型?

下面是详细信息:

的方法:

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中的原始类型吗?

谢谢

伊塔马尔

+0

我找到了UnsatisfiedLinkError的原因。显然,我试图返回一个被定义为Core内部类的类型是这个问题。一旦我将CoreOutput定义移动到它自己的类文件中,它就起作用了。有没有人知道如何在这种情况下返回一个内部类? – Ita 2010-11-24 17:34:39

回答

1

UnsatisfiedLinkError当JVM不能找到方法时抛出。所以它与你的方法声明有关。查看javah为您创建函数标题。看看这个:javah

+0

我试过使用javah,它给出了与我已经拿到的签名相同的结果..必须有一些我失踪的东西... – Ita 2010-11-24 09:18:08