在 Android 中,JNI 调用可用于从其他来源加载本机代码。从链接http://bobao.360.cn/learning/detail/3765.html,以下示例代码显示了从本机库调用函数“decryptString”时 smali 代码的样子。
const/16 v3, 0x57
new-array v1, v3, [B
fill-array-data v1, :array_2a
.local v1, "encryptedStringBytes":[B
invoke-static {}, Lorg/cf/nativeharness/Cryptor;->getInstance()Lorg/cf/nativeharness/Cryptor;
move-result-object v0
.line 21
.local v0, "c":Lorg/cf/nativeharness/Cryptor;
# v3 contains a String made from encrypted bytes
new-instance v3, Ljava/lang/String;
invoke-direct {v3, v1}, Ljava/lang/String;-><init>([B)V
# Call the decryption method, move result back to v3
invoke-virtual {v0, v3}, Lorg/cf/nativeharness/Cryptor;->decryptString(Ljava/lang/String;)Ljava/lang/String;
move-result-object v3
原始的 Java 代码如下所示:
public class Cryptor {
private static Cryptor instance = null;
public static Cryptor getInstance() {
if (instance == null) {
instance = new Cryptor();
}
return instance;
}
public native String decryptString(String encryptedString);
}
smali 代码似乎没有迹象表明正在加载本机代码。smali 代码中的哪些“签名”可以很好地表明 JNI 调用是从原始 Java 代码进行的?