Java Language C ++ (콜백)에서 Java 메소드 호출


원시 코드에서 Java 메소드 호출은 두 단계 프로세스입니다.

  1. 메서드 명과 기술자를 사용해, GetMethodID JNI 함수를 가지는 메서드 포인터를 취득한다.
  2. 여기에 나열된 Call*Method 함수 중 하나를 Call*Method 하십시오 .

Java 코드

/*** com.example.jni.JNIJavaCallback.java ***/

package com.example.jni;

public class JNIJavaCallback {
    static {
        System.loadLibrary("libJNI_CPP");
    }
    
    public static void main(String[] args) {
        new JNIJavaCallback().callback();
    }

    public native void callback(); 

    public static void printNum(int i) {
        System.out.println("Got int from C++: " + i);
    }
    
    public void printFloat(float i) {
        System.out.println("Got float from C++: " + i);
    }
}

C ++ 코드

// com_example_jni_JNICppCallback.cpp

#include <iostream>
#include "com_example_jni_JNIJavaCallback.h"

using namespace std;

JNIEXPORT void JNICALL Java_com_example_jni_JNIJavaCallback_callback(JNIEnv *env, jobject jthis) {
    jclass thisClass = env->GetObjectClass(jthis);

    jmethodID printFloat = env->GetMethodID(thisClass, "printFloat", "(F)V");
    if (NULL == printFloat)
        return;
    env->CallVoidMethod(jthis, printFloat, 5.221);

    jmethodID staticPrintInt = env->GetStaticMethodID(thisClass, "printNum", "(I)V");
    if (NULL == staticPrintInt)
        return;
    env->CallVoidMethod(jthis, staticPrintInt, 17);
}

산출

C ++에서 부동 소수점 가져 오기 : 5.221
C ++에서 가져온 int : 17

설명자 가져 오기

설명자 (또는 내부 형식 서명 )는 컴파일 된 .class 파일의 javap 프로그램을 사용하여 가져옵니다. 다음은 javap -p -s com.example.jni.JNIJavaCallback 의 결과입니다.

Compiled from "JNIJavaCallback.java"
public class com.example.jni.JNIJavaCallback {
  static {};
    descriptor: ()V

  public com.example.jni.JNIJavaCallback();
    descriptor: ()V

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V

  public native void callback();
    descriptor: ()V

  public static void printNum(int);
    descriptor: (I)V  // <---- Needed

  public void printFloat(float);
    descriptor: (F)V  // <---- Needed
}