철이의 컴노리
  • 안녕하세요!
  • 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 튜토리얼

24장. 정적필드 찾기

자바 클래스에서 정적필드를 찾는 예제를 작성해 보자. Integer클래스에서 Integer형의 최대값을 가지고 있는 MAX_VALUE 정적필드를 네이티브 레이어에서 찾아보자.

$ vi FindStaticField.cpp
#include <jni.h>
#include <iostream>

jint getMaxValueOfInteger
(
    JNIEnv        *env,
    jobject        thiz
)
{

    //Find the Integer class
    jint maxValue = -1;
    jclass integerClass = env->FindClass("java/lang/Integer");
    if(integerClass == nullptr) {

        std::cout << "Failed to find the Integer class" << std::endl;

    } else {
        //Find the static field
        jfieldID maxIntegerID = env->GetStaticFieldID(integerClass, "MAX_VALUE", "I");
        if(maxIntegerID == nullptr) {
            std::cout << "Failed to find the MAX_VALUE field in the Integer class" << std::endl;
        } else {
            //Get the MAX_VALUE value
            maxValue = env->GetStaticIntField(integerClass, maxIntegerID);
        }
    }

    return maxValue;
}



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[1] = {
        {
            const_cast<char*>("getMaxValueOfInteger"),
            const_cast<char*>("()I"),
            reinterpret_cast<void*>(getMaxValueOfInteger)
        }
    };

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

위의 코드를 보면 아래의 순서대로 정적필드를 찾았다.

  1. 클래스를 찾는다

    • FindClass()

  2. 정적 필드 ID를 구한다

    • GetStaticFieldID()

  3. 정적 필드의 값을 구한다.

    • GetStaticIntField()

위 코드를 컴파일해서 라이브러리로 만든다.

$ g++ "-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/" -std=c++11 -c FindStaticField.cpp
$ g++ -dynamiclib -o libfindstaticfield.jnilib findstaticfield.o

자바 코드에서 라이브러리를 사용해 보자.

$ vi Client.java
public class Client {

    public native int getMaxValueOfInteger();

    public static void main(String[] args) {

        Client client = new Client();
        System.out.println("Integer's MAX_VALUE is " + client.getMaxValueOfInteger());

    }


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

컴파일하고 실행해 본다.

$ javac Client.java
$ java Client
Integer's MAX_VALUE is 2147483647
Previous23장. 정적 메서드 찾기Next25장. 자바 클래스 인스턴스 생성하기

Last updated 6 years ago

Was this helpful?