JNIEnv
- Java kursu
- Uzman
- Ders 27/46
- 5 dk
JNIEnv ile yerel çağrı ortamını öğrenirsin.
JNIEnv arabirimi
Her JNI C işlevinin ilk parametresi JNIEnv*'dir. Bu işaretçi, C tarafından JVM ile konuşmayı sağlar: Java metotlarını çağırma, nesne oluşturma, dizi ve string dönüştürme gibi işlemler env->... üzerinden yapılır.
Statik native metotlarda ikinci parametre jclass (sınıf), örnek metotlarda jobject (this) olur. Bu ikisi olmadan hangi sınıf veya nesne üzerinde çalıştığını bilemezsin.
C işlev adlandırması
JNI, C işlevini Java metoduyla eşleştirmek için sabit bir ad kullanır: Java_paketAdı_SınıfAdı_metotAdı. Paketteki noktalar alt çizgi olur. Örneğin NativeOps.sum için C işlevi Java_NativeOps_sum olarak adlandırılır.
Aşırı yüklenmiş metotlarda isim çakışmasını önlemek için imza eki (__II gibi) eklenir. Bu adlandırma JNI bağlama mekanizmasının temelidir.
Uygulama C işlev adını üreten sınıfı yaz
class JniCall tanımla; String className ve String method alanları ve bunları atayan JniCall(String className, String method) yapıcısı olsun. String cName() metodu "Java_" + className + "_" + method döndürsün. main içinde JniCall c = new JniCall("NativeOps", "sum"); oluştur ve System.out.println(c.cName()); ile yazdır.
Başlangıç kodu
// JniCall sınıfını tanımla: className, method alanları, yapıcı ve cName metodu
// Main: bir JniCall örneği oluştur ve cName çıktısını yazdırÖrnek çözüm
class JniCall {
String className;
String method;
JniCall(String className, String method) {
this.className = className;
this.method = method;
}
String cName() {
return "Java_" + className + "_" + method;
}
}
public class Main {
public static void main(String[] args) {
JniCall c = new JniCall("NativeOps", "sum");
System.out.println(c.cName());
}
}Beklenen çıktı
Java_NativeOps_sum
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 JNI parametre türlerini eşleştir
| Kavram | Anlamı |
|---|---|
JNIEnv* |
İlk parametre |
jclass |
Statik metotta sınıf |
jobject |
Örnek metotta this |
jint |
int karşılığı |
2 C işlev adını tamamla
Java_____(JNIEnv* env, jclass cls, jint a, jint b)
Java_NativeOps_sum(JNIEnv* env, jclass cls, jint a, jint b)
Açıklama: C işlevi Java_NativeOps_sum olarak adlandırılır.
3 JNIEnv* ne işe yarar?
- Sınıfı derler
- Thread başlatır
- Dosya okur
- C'den JVM'e erişir Doğru cevap
Açıklama: JNIEnv* üzerinden C, Java metotlarını çağırır ve nesne oluşturur.