в конструкторе JNI Android вызывать конструктор не удается - PullRequest
2 голосов
/ 15 февраля 2012

Я пытаюсь вызвать конструктор из моего кода JNI Android;но каким-то образом это терпит неудачу со следующим исключением .. Я уверен, что пропускаю что-то действительно маленькое;но я не могу понять ... кто-нибудь может указать, пожалуйста?

 02-14 16:56:56.689: W/dalvikvm(397): JNI WARNING: JNI method called with exception raised
 02-14 16:56:56.710: W/dalvikvm(397):              in Lpv/ndk/Employee;.createWithAge (I)Lpv/ndk/Employee; (GetMethodID)

 02-14 16:56:56.710: W/dalvikvm(397): Pending exception is:
 02-14 16:56:56.710: I/dalvikvm(397): Ljava/lang/NoClassDefFoundError;: pv.ndk.Employee;
 02-14 16:56:56.723: I/dalvikvm(397):   at pv.ndk.Employee.createWithAge(Native Method)

 02-14 16:56:56.740: I/dalvikvm(397): Caused by:
 02-14 16:56:56.740: I/dalvikvm(397): Ljava/lang/ClassNotFoundException;: pv.ndk.Employee; in loader dalvik.system.PathClassLoader[/data/app/pv.ndk-2.apk]

Вот мой код:

Класс Employee имеет 2 конструктора и метод для возврата возраста

Employee()
Employee(int age)
int getAge();

удивительно, когда я вызываю метод getAge () .. вызов проходит и извлекает возраст ... Но когда я пытаюсь вызвать "конструктор сотрудника", а затем пытаюсь получить getAge () это исключениевыброшено ...

как-то не удается найти класс: я попробовал все возможности, с которыми я сталкивался, для GetObjectClass ()

это работает;когда я передаю объект Employee при вызове

JNIEXPORT jint JNICALL Java_pv_ndk_Employee_getAgeC(JNIEnv *env, jobject callingObject, jobject employeeObject) 
{
jclass employeeClass = env->GetObjectClass(employeeObject);
jmethodID midGetName = env->GetMethodID(employeeClass, "getAge", "()I");
int age =  env->CallIntMethod(employeeObject, midGetName);
//other code
}

ЭТО НЕ РАБОТАЕТ;Я не уверен, почему он не может найти класс .. Я пробовал с «Lpv / ndk / Emploee», «LEmployee», «pv / ndk / Employee» .. и даже пытался использовать следующий подход:

jclass localRefCls = env->FindClass("pv/ndk/Employee");
jclass clazzEmployee = (_jclass*)env->NewGlobalRef(localRefCls);
JNIEXPORT jobject JNICALL Java_pv_ndk_Employee_createWithAge(JNIEnv *env, jobject callingObject, jint age) {
jclass employeeClass = env->FindClass("pv/ndk/Employee");
jmethodID midConstructor = env->GetMethodID(employeeClass, "<init>", "(I)V"); // BOOM SCREWED HERE .. !!
}

Но каждый раз, когда мой код приходит к env-> GetMethodID - vm Aborts ...

Ответы [ 2 ]

0 голосов
/ 04 мая 2012

Метод FindClass нуждается в полной подписи класса. Примечание: если у вас есть какие-то внутренние классы / не будет работать, вы должны использовать $ например, если имя вашего пакета A.B.C, а имя вашего основного класса - D, а имя вашего подкласса - E, тогда вы должны использовать FindClass ("LA / B / C / D $ E;");

0 голосов
/ 18 февраля 2012

удивительно тот же код работает сегодня:)

вероятно, это было связано с тем, как я развертывал код ... Я считал, что об "автоматической сборке" следовало бы позаботиться об этом ... Действительно извиняюсь за то, что здесь возникла путаница с рабочим фрагментом кода ... Я Я новичок в разработке NDK и JNI ...

Это определенно работает

jclass employeeClass = env->FindClass("pv/ndk/Employee");
//constructor call depicted by <init> and it's parameters (I) and return type V
jmethodID midConstructor = env->GetMethodID(employeeClass, "<init>", "(I)V");

Я думаю, что причина, возможно, связана с тем, что «родная разделяемая библиотека» не развертывается после новой модификации ... Вот шаги, которые я использовал, чтобы следовать: [1] Я перестроил «Shared-library» с модификацией; используя "ndk-build" __ [2] Затем я развертываю проект Android на моем устройстве

но похоже Eclipse кеширует "библиотеку" ??? [пожалуйста, поправьте меня, если я ошибаюсь] Следовательно, изменения были приняты во внимание ...

Решение: [возможно]

[1] Я перестроил библиотеку __ [2] Я очистил весь проект __ [3], а затем развернул проект на устройстве ...

...