인디노트

JNI 의 Native 함수를 만들때 유의사항 본문

소스 팁

JNI 의 Native 함수를 만들때 유의사항

인디개발자 2022. 9. 2. 14:22

// *str1 이든 **str2 이든 해당 메모리가 Java 에서 만들어져 올 때는 똑같이 값들이 인, 아웃 모두 전달된다.

// str1 을 malloc 으로 메모리를 만들면 그것을 out 되지 않는다. 따라서 의미가 없다.

// *str2 를 malloc 으로 메모리를 만들면 그것은 out 된다. 하지만 Java 에서 어떻게 해당 메모리를 해제해 줄 수 있을까?

// JNI 함수에서 Java 로부터 들어오는 null 배열을 어떻게 연결 시켜줄 수 있을까? 가능하지 않다. 에러가 난다.

// 따라서 JNI 를 사용한다면 중간에 다른 물리적인 교환이 이루어져야 하는데 그게 여의치 않다.

// JNI 를 사용할 때 Native 에서 메모리를 생성해서 넘겨줘야 한다면 그것은 문제를 내포할 수 있기 때문에 Java 쪽에서 메모리를 만들어서 사용하는 방식이 좋을 듯 싶다.

// Native C 코드에서 ** 를 사용하고 * 가 NULL 인지 아닌지를 확인하여 처리하도록 하면 C 타입과 Java 타입 모두 만족할 수 있을 듯 하다.

// Native 함수에서는 메모리가 만들어져 오는것과 Native 에서 스스로 만들어 out 시키는 (물론 C 타입에서 호출할 때) 방식을 모두 처리하기 위해서 입력되는 포인터 인수를 **str 와 같이 2중 포인터로 사용하도록 하자.

// JNI 에서만 사용하는 Native 함수라면 *str 이렇게만 해도 된다. 왜냐하면 위의 상황에서처럼 어차피 메모리가 Java 쪽에서 만들어져 오는 방식으로 구현해야 하기 때문이다.

반응형
Comments