철이의 컴노리
  • 안녕하세요!
  • KOTLIN
  • ANDROID
    • Architecture Components
      • 프로젝트에 추가하기
      • 데이터 바인딩 라이브러리
        • 시작하기
        • 레이아웃 및 바인딩 표현식
      • 라이프 사이클 처리
      • ViewModel
    • CameraX
      • CameraX 아키텍처
      • 구성
      • 미리보기
      • 이미지 분석
      • 이미지 캡처
      • 제조 업체 확장 기능
    • View
      • 커스텀뷰의 크기 정하기
    • JNI 튜토리얼
      • 1장. 저자 소개
      • 2장. Hello JNI
      • 3장. 메서드 등록
      • 4장. int 데이터형 값 주고 받기
      • 5장. boolean 데이터형 값 주고 받기
      • 6장. double 데이터형 값 주고 받기
      • 7장. float 데이터형 값 주고 받기
      • 8장. long 데이터형 값 주고 받기
      • 9장. short 데이터형 값 주고 받기
      • 10장. char 데이터형 값 주고 받기
      • 11장. byte 데이터형 값 주고 받기
      • 12장. JNI에서 문자열 다루기 1/3
      • 13장. JNI에서 문자열 다루기 2/3
      • 14장. JNI에서 문자열 다루기 3/3
      • 15장. 레퍼런스 이해하기
      • 16장. 배열 다루기 1/4
      • 17장. 배열 다루기 2/4
      • 18장. 배열 다루기 3/4
      • 19장. 배열 다루기 4/4
      • 20장. 중간 요약
      • 21장. 자바 클래스 찾기 1/2
      • 22장. 자바 클래스 찾기 2/2
      • 23장. 정적 메서드 찾기
      • 24장. 정적필드 찾기
      • 25장. 자바 클래스 인스턴스 생성하기
      • 26장. 자바 클래스 인스턴스 메서드 찾기
      • 27장. 자바 클래스의 인스턴스 필드 찾기
      • 28장. 네이티브 쓰레드 실행하기
  • Swift
    • What' New
      • Swift 5.0
        • Result 타입
        • Raw 문자열
        • 커스텀 문자열 보간
    • Codable
      • 커스텀 타입 인코딩 및 디코딩
  • iOS
  • OpenGL
    • OpenGL Tutorial
      • 1장. 저자 소개
      • 2장. OpenGL 윈도우 프레임웍 만들기 1편
      • 3장. OpenGL 윈도우 프레임웍 만들기 2편
      • 4장. 점그리기
      • 5장. 선 그리기
      • 6장. 다각형 그리기
      • 7장. 색 표현하기
      • 8장. 3차원 폴리곤 그리기
      • 9장. 투영변환
      • 10장. 이동, 회전, 크기 변환
      • 11장. 빛, 재질 표현하기
      • 12장. 텍스춰매핑
    • OpenGL ES Tutorial for iOS
      • 1장. 저자 소개
      • 2장. 튜토리얼 소개
      • 3장. OpenGL|ES 개발 환경 만들기
      • 4장. 뷰 배경색상 변경하기
      • 5장. 투영에 대해서 1/2
      • 6장. 투영에 대해서 2/2
      • 7장. 선분 및 삼각형 그리기
      • 8장. 색상칠하기
      • 9장. 텍스춰맵핑
      • 10장. 종횡비
      • 11장. 텍스춰 UV좌표
      • 12장. 텍스춰매핑 파라미터
      • 13장. 깊이버퍼
      • 14장. 원근투영
  • ENV
    • oh-my-zsh
      • 특정 git 폴더에서 zsh 이 느려질 때
  • Ubuntu
    • UEFI USB
    • nvidia driver
    • /dev/kvm on Android Studio
    • install oracle-jdk8
  • chromium
    • javap
Powered by GitBook
On this page

Was this helpful?

  1. ANDROID
  2. JNI 튜토리얼

19장. 배열 다루기 4/4

자바 레이어에서 전달 받은 배열을 C/C++ 배열로 변환한 후, 특정 작업을 수행한 다음 다시 자바 배열로 반환하는 예제를 작성해 보자. 배열의 합과 평균을 배열로 반환해 보자.

$ vi AverageArray.cpp
#include <jni.h>

void addValue
(
    JNIEnv          *env,
    jobject         thiz,
    jdoubleArray    doubleArray,
    jdouble         value
)
{
    //get the length of doubleArray
    jsize length = env->GetArrayLength(doubleArray);
    if(length == 0)
        return ;

    //convert java-array to c-array jdouble[]
    jdouble *cdoubleArray = env->GetDoubleArrayElements(doubleArray, nullptr);

    //add value
    for(int i=0; i<length; i++) {
        cdoubleArray[i] += value;
    }

    env->ReleaseDoubleArrayElements(doubleArray, cdoubleArray, 0);
}

jdoubleArray getSumAndAverage
(
    JNIEnv          *env,
    jobject         thiz,
    jdoubleArray    doubleArray
)
{
    //get the length of doubleArray
    jsize length = env->GetArrayLength(doubleArray);
    if(length == 0)
        return nullptr;

    //convert java-array to c-array jdouble[]
    jdouble *cdoubleArray = env->GetDoubleArrayElements(doubleArray, nullptr);

    jdouble sum = 0.0;
    //add value
    for(int i=0; i<length; i++) {
        sum += cdoubleArray[i];
    }

    jdouble average = sum / length;

    env->ReleaseDoubleArrayElements(doubleArray, cdoubleArray, 0);

    //make a new jdoubleArray to return
    jdoubleArray newDoubleArray = env->NewDoubleArray(2);

    //make a c array
    jdouble *newCDoubleArray = new jdouble[2];
    newCDoubleArray[0] = sum;
    newCDoubleArray[1] = average;

    //copy c-array to java-array
    env->SetDoubleArrayRegion(newDoubleArray, 0, 2, newCDoubleArray);

    delete [] newCDoubleArray;


    return newDoubleArray;
}


JNIEXPORT jint JNICALL JNI_OnLoad
(
    JavaVM      *vm,
    void        *reserved
)
{
    JNIEnv      *env;
    if(vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6)) {
        return -1;
    }

    JNINativeMethod nm[2] = {
        {
            const_cast<char*>("addValue"),
            const_cast<char*>("([DD)V"),
            reinterpret_cast<void*>(addValue)
        }
        ,
        {
            const_cast<char*>("getSumAndAverage"),
            const_cast<char*>("([D)[D"),
            reinterpret_cast<void*>(getSumAndAverage)
        }
    };

    jclass cls = env->FindClass("Client");
    env->RegisterNatives(cls, nm, 2);
    return JNI_VERSION_1_6;
}

위 코드에는 배열의 모든 원소에 특정 값을 더하는 함수와 배열의 총합과 평균을 2개의 배열 원소에 담아 반환하는 함수가 있다. 이 두 함수의 코드는 지금까지 배열을 다룬 내용을 종합한 것이니 따로 설명은 하지 않는다.

코드를 컴파일하고 라이브러리로 만든다.

$ g++ "-I/System/Library/Java/JavaVirtualMachines/Current/" -std=c++11 -c AverageArray.cpp
$ g++ -dynamiclib -o libaveragearray.jnilib averagearray.o

이제 이 라이브러리를 사용하는 자바 코드를 작성한다.

$ vi Client.java
public class Client {

    private native void addValue(double[] array, double value);
    private native double[] getSumAndAverage(double[] array);

    public static void main(String[] args) {

        Client client = new Client();

        double [] array = new double[] { 1, 2, 3, 4, 5 };

        client.addValue(array, 10);

        for(double e : array) {
            System.out.print(e + " ");
        }
        System.out.println("");

        double [] ret = client.getSumAndAverage(array);

        System.out.println("sum = " + ret[0] + " average = " + ret[1]);

    }

    static {
        System.loadLibrary("averagearray");
    }
}

컴파일하고 실행해 본다.

$ javac Client.java
$ java Client
11.0 12.0 13.0 14.0 15.0
sum = 65.0 average = 13.0
Previous18장. 배열 다루기 3/4Next20장. 중간 요약

Last updated 6 years ago

Was this helpful?