January 08, 2017

Selamün Aleyküm;

JNI'de 'class not found' sorununu çözünce başka bir sual aklıma takıldı. Ben Oracle'ın sitesinden JNI öğreniyorum. 'FindClass' ve 'GetObjectClass' adlı iki fonksiyon var. Lakin 'FindClass' java sınıfını, var olan Java sınıflarını almak için kullanıyoruz, fakat 'GetObjectClass' fonksiyonunu, bir nesnenin sınıfını almak için kullanıyormuşuz. Benim burada anlamadığım bu 2 fonksiyonu birbirlerinin yerine kullanıyorlar. Mesela:

jclass clazz = env->FindClass("com/package/ExampleClass");
jmethodID method_id = env->GetStaticMethodID(clazz, "javaMethod", "()V");
env->CallStaticVoidMethod(clazz, method_id);

Bu şekilde Java metodunu static yapmak mecburiyetindeyim, yoksa hata veriyor. Lakin benim Java metotlarından bazılarını statik yapmamam lazım. O zaman da bu şekilde kod çalışmıyor (GetStaticMethodID yerine GetMethodID ve CallStaticVoidMethod yerine de CallVoidMethod kullanıyorum). FindClass yerine bazı kişiler GetObjectClass kullanmış şu şekilde:

jclass clazz = env->FindClass("com/package/ExampleClass");
jclass class2 = env->GetObjectClass(clazz);
jmethodID method_id = env->GetMethodID(class2, "javaMethod", "()V");
env->CallVoidMethod(class2, method_id);

Lakin bu şekilde hata alıyorum ve Java tarafında javaMethod'u static yapıp ilk yazdığım kodu kullanmak zorunda kalıyorum. Dediğim gibi bazı metotlarım static olmamalı. Ama o zaman da metotu çağıramıyorum. Acaba GetObjectClass tanımında geçen "'bir nesnenin sınıfını döndürür.'" derken nesneden kastı nedir? Ayrıca şekildeki bir Java metodunu:

public class ExamleClass
{
 public void javaMethod()
 {
   System.out.println("Hello");
 }
}

nasıl çağırabilirim (metot static olmamalı)? Oracle bağlantısı: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
Teşekkürler!

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]