C/C++ ile uygulama
- Java kursu
- Uzman
- Ders 28/46
- 5 dk
C/C++ ile JNI uygulamasını öğrenirsin.
JNI tür eşlemesi
JNI, Java türlerini C tarafında kullanılan imza harfleriyle gösterir: int → I, long → J, boolean → Z, void → V, String → Ljava/lang/String;. Metot imzası (parametreler)dönüş biçimindedir.
Örnek: int sum(int a, int b) metodunun imzası (II)I'dir. Bu imzalar javap -s ile de görülebilir ve aşırı yükleme için C işlev adına eklenir.
Yerel kütüphane yükleme
Bir native metodu çağırmadan önce yerel kütüphane yüklenmelidir: System.loadLibrary("nativeops");. Bu çağrı genelde static blokta yapılır; böylece sınıf yüklenirken kütüphane hazır hale gelir. Kütüphane java.library.path üzerinde aranır.
Kütüphane bulunamazsa UnsatisfiedLinkError fırlatılır. Çok platformlu projelerde her işletim sistemi için ayrı kütüphane derlenir.
Uygulama tür eşleyici ve native sınıfı yaz
class TypeMapper tanımla; static String jni(String t) metodu bir switch ile int → "I", long → "J", boolean → "Z", void → "V" döndürsün. class NativeOps tanımla; native int sum(int a, int b); ve static blokta System.loadLibrary("nativeops"); çağrısı olsun (try ile sar). main içinde System.out.println("(" + TypeMapper.jni("int") + TypeMapper.jni("int") + ")" + TypeMapper.jni("int")); yazdır.
Başlangıç kodu
// TypeMapper sınıfını tanımla: static String jni(String t) switch ile I/J/Z/V döndürsün
// NativeOps sınıfını tanımla: native int sum(int a, int b) ve static blokta System.loadLibrary
// main: (II)I imzasını yazdırÖrnek çözüm
class TypeMapper {
static String jni(String t) {
return switch (t) {
case "int" -> "I";
case "long" -> "J";
case "boolean" -> "Z";
case "void" -> "V";
default -> "?";
};
}
}
class NativeOps {
native int sum(int a, int b);
static {
try { System.loadLibrary("nativeops"); } catch (UnsatisfiedLinkError e) { }
}
}
public class Main {
public static void main(String[] args) {
System.out.println("(" + TypeMapper.jni("int") + TypeMapper.jni("int") + ")" + TypeMapper.jni("int"));
}
}Beklenen çıktı
(II)I
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 int türünün JNI imza harfi nedir?
- I Doğru cevap
- J
- Z
- L
Açıklama: int türü JNI imzasında I harfiyle gösterilir.
2 metot imzasını tamamla
String sig = "(____";
String sig = "(II)I";
Açıklama: (II)I imzası int sum(int, int) anlamına gelir.
3 tür eşlemesini eşleştir
| Kavram | Anlamı |
|---|---|
int |
I |
long |
J |
boolean |
Z |
String |
Ljava/lang/String; |