2017-10-09 3 views
2

Kotlin utilise-t-il la même implémentation d'interface native que Java sous le capot? Est-il aussi efficace (ou inefficace) qu'en Java (coût du transfert d'objets, flux d'octets, etc.)?Interface native Kotlin

Répondre

2

Sous le capot, l'implémentation est la même, car elle sera convertie au même code Java. Cela signifie qu'il est efficace comme votre code Java.

Compte tenu de cette classe Kotlin avec la méthode native nativeMethod():

class ExampleJni { 

    companion object { 
     init { 
      System.loadLibrary("example-jni") 
     } 
    } 

    external fun nativeMethod(): String 
} 

Il utilisera le « même » la mise en œuvre de cette classe Java (la conversion est pas exactement le même, mais il ne sera pas un impact sur la implémentation native):

public class ExampleJni { 

    static { 
     System.loadLibrary("hello-jni"); 
    } 

    public final native String nativeMethod(); 
} 

EDIT

Pour être plus clair au sujet de la conversion. Si vous décompilez le code Kotlin, vous pouvez voir qu'il est converti en deux classes. La première est une contenant les méthodes natives:

@dalvik.annotation.MemberClasses 
@kotlin.Metadata 
public final class ExampleJni { 

    public static final ExampleJni$Companion Companion; 

    public ExampleJni() { ... } 

    static void <clinit>() { ... } 
    @org.jetbrains.annotations.NotNull 
    // Here you can see that the implementation is the same. 
    public final native String nativeMethod() { ... } 
} 

L'autre est la classe interne liée à la companion object.

@dalvik.annotation.EnclosingClass 
@dalvik.annotation.InnerClass 
@kotlin.Metadata 
public final class ExampleJni$Companion { 

    private ExampleJni$Companion() { ... } 
    public ExampleJni$Companion(DefaultConstructorMarker) { ... } 
}