[자바] 밑줄 (_) 이 들어가는 JNI 함수명


JNI에서는 함수명에 자바의 패키지 경로를 모두 쓰게 되는데, 그 때에 .(점)을 _(밑줄)로 치환하게 됩니다. 따라서 자바 함수명 자체에 밑줄이 있으면 문제가 생깁니다. 이런 경우 자바 함수명에 있는 밑줄은 JNI에서 _1로 치환하면 됩니다. 아래는 간단한 예제입니다.


// 자바

package com.tistory.crmn;

public class Hello {

    static native int get_hello();

}



// JNI

extern "C" JNIEXPORT jint JNICALL

Java_com_tistory_crmn_Hello_get_1hello(JNIEnv* env, jobject thiz) { // get_1hello에 주목하세요

    return (jint) 1;

}


갑자기 '기독교 교리를 수학으로 설명하면 이해하기 쉬워지지 않을까?' 하는 생각이 들어서 한번 시도해 봤습니다.

정의역이 온 우주에 존재하는 모든 사람의 집합이고 공역이 참과 거짓인 함수를 생각해 보겠습니다. 이 함수의 이름은 ‘구원’입니다. 수식을 사용해서 써 보면

함수 구원:X -> Y
X = {x | x는 사람}
Y = {참, 거짓}

이렇게 되겠습니다. 모든 사람을 원소나열법으로 쓸 수는 없기에 집합 X를 정의할 때에는 조건제시법을 사용했습니다.

이 구원이라는 함수는 사람이 대입되면 그 사람이 구원받았는지를 알려주는 함수입니다. 예를 들어 '구원(철수) = 참' 이라면 철수는 구원받은 것이고 '구원(철수) = 거짓' 이라면 철수는 구원받지 못한 것입니다. 구원은 모든 사람의 집합을 정의역으로 가지는 함수이기 때문에 철수 영희 갑돌이 갑순이를 다 대입해 볼 수 있지만 바둑이는 대입할 수 없습니다. 로그(log)에 음수를 넣으면 안 되는 것처럼 '구원(바둑이)'는 정의가 되어 있지 않습니다.

이제 우리의 관심사는 ‘무엇을 하면 구원받는가?’ 입니다. 구원의 조건이라고 생각해도 되겠네요. 이를 수학적으로 표현하려면 고등학교 집합과 명제 시간에 배운 명제함수가 필요합니다. 명제함수란 ‘p(x) 이면 q(x) 이다’ 형태의 문장을 뜻합니다. 그러니까 우리는

p(x) 이면 구원(x) 이다

에 해당하는 p(x)를 찾고 싶은 것입니다. 예를 들어 착한 사람이 구원받는다면 '착함(x) 이면 구원(x) 이다' 가 될 것입니다.

여기서 잠시 공리계에 대한 이야기를 해야 합니다. 주어진 이론 체계 안에서 가장 기초적인 근거가 되면서 증명이 필요없이 참으로 인정되는 명제를 공리라고 하고, 그런 공리들을 모아놓은 것을 공리계라고 합니다. 수학에서는 증명을 할 때 어떤 공리계를 사용하느냐가 중요한데, 우리는 기독교 신앙에 대해 이야기하고 있으니 우리의 공리계는 성경책이 되겠습니다. 공리계에 대해서는 나중에 더 자세히 이야기 할 기회가 있을 것입니다. 하여튼 지금은 공리계에 있는 명제는 그냥 묻지도 따지지도 말고 참이라는 것만 짚고 넘어가도록 하겠습니다.

다시 구원 이야기로 돌아와서, 우리가 찾고 싶은 구원의 조건인 p(x)에 대해 성경은 “이르되 주 예수를 믿으라 그리하면 너와 네 집이 구원을 받으리라 하고 (사도행전 16:31)” 라고 말합니다. 이건 성경이라는 우리의 공리계 안에서는 따질 필요 없이 참입니다. 이 구절에서 용어를 그대로 따 와서, 어떤 사람이 주 예수를 믿는지의 여부를 알려주는 ‘믿음’이라는 함수를 생각해 보면 다음과 같이 됩니다.

믿음(x) 이면 구원(x) 이다

예를 들어 x에 영희를 대입하면 "믿음(영희) 이면 구원(영희) 이다", 즉 "영희는 주 예수를 믿는다. 그러므로 영희는 구원받았다." 라고 말할 수 있겠습니다.

그러면 구원 받을 수 있는 다른 조건이 있나? 즉 위의 p(x)에 믿음(x) 대신 들어갈 수 있는 함수가 있을까? 하는 궁금증이 생기는데, 그 이야기는 기회가 되면 해 보도록 하겠습니다. 이거 은근 재미있네요 ㅋ

[자바] JNI 시그니처 (Signiture)


JNI 작업을 엄청 하다가 갑자기 정리해놓고 싶어서 씁니다.

https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html 에 있는 내용을 번역했습니다.


타입 시그니처


Z : 부울 값

B : 바이트

C : 문자

S : 쇼트 정수

I : 인트 정수

J : 롱 정수

F : 플로트 실수

D : 더블 실수

L : 클래스-전체-경로 ; 클래스

[ : 배열

( 인자들 ) 반환형 : 함수


예를 들어 다음의 자바 함수를 생각해 보겠습니다.


long f (int n, String s, int[] arr); 


이 함수의 시그니처는 다음과 같습니다.


(ILjava/lang/String;[I)J


---

(제가 추가한 내용)

I는 정수 n, Ljava/lang/String;은 문자열 s, [I는 정수 배열 arr이고 J는 반환값 long을 뜻합니다.


+ Recent posts