신기한 현상
지난 주에 이상한 생각이 하나 들었쩌.
웹뷰 인터페이스에 바이트 어레이를 사용하지 못하는 문제인데 vararg 인자로 넘기는 거여요.
gpt5에 지식이 박사급이라고 하는데 사실 인류가 한번도 시도하지 아니한 접근 방식에 긍정적인 응답을 기대하기 어려워요.
물론 현실에 박사들이라 하더라도 다아는거 아니고 소프트웨어 개발은 일반적으로 내가 더 잘하겠쩌.
// 웹뷰
android.test(new Int8Array([1,2,3,4])// 코틀린
@JavascriptInterface fun test(vararg bytes: Byte) {
File(dataFiles, "output.bytes").appendBytes(bytes)
}(gpt5) 위에 코드가 작동하는지 알아봐줄래?
좋은 질문이에요 👀 이 코드가 그대로는 바로 작동하지 않습니다. 이유를 단계별로 짚어볼게요.
📌 문제 상황
JavaScript 쪽에서:
android.test(new Int8Array([1,2,3,4]))
을 호출하면, 안드로이드 WebView의 @JavascriptInterface 는 JavaScript 객체를 Java로 변환해서 넘깁니다.
하지만 변환 규칙이 엄격해서, Int8Array 는 직접 ByteArray 나 vararg Byte 로 변환되지 않음 → 호출 실패.
📌 왜 안 되는가?
@JavascriptInterface는 다음과 같은 타입만 직접 지원합니다:String,int,boolean,long,float,double배열(
Int8Array)이나 다른 객체는 자동 변환 불가 →test(vararg bytes: Byte)와 매칭되지 않음.그래서 WebView 입장에서는
android.test()를 찾지 못하거나,java.lang.IllegalArgumentException이 발생할 수 있어요.
📌 해결 방법
1. JSON 문자열로 전달 후 변환
JavaScript:
android.test(JSON.stringify([1,2,3,4]));
Kotlin:
@JavascriptInterface
fun test(json: String) {
val bytes = JSONArray(json).let { arr ->
ByteArray(arr.length()) { i -> arr.getInt(i).toByte() }
}
File(dataFiles, "output.bytes").appendBytes(bytes)
}
2. Base64로 인코딩
JavaScript:
let arr = new Int8Array([1,2,3,4]);
let b64 = btoa(String.fromCharCode.apply(null, arr));
android.test(b64);
Kotlin:
import android.util.Base64
@JavascriptInterface
fun test(base64: String) {
val bytes = Base64.decode(base64, Base64.DEFAULT)
File(dataFiles, "output.bytes").appendBytes(bytes)
}
✅ 결론:
지금 코드처럼 Int8Array → vararg Byte 로 직접 매핑은 되지 않아요.
→ 반드시 문자열(JSON, Base64 등)로 직렬화해서 전달한 뒤, Kotlin 쪽에서 디코딩해야 합니다.
혹시 이 상황에서 성능(큰 배열 전송)도 신경 쓰셔야 하나요?
그렇다면 Base64 vs JSON 중 어느 방식이 더 나은지 비교도 정리해드릴까요?
