2017-01-04 2 views
1

슈퍼 파워 "Simple USB Example"는 C++ 방식을 기반으로 Java 측에서 UI를 업데이트하기 위해 아래 코드를 사용합니다. 이것은 처음으로 JNI을 보았습니다 혼자 다음에 방법이 있습니다. 비슷한 상황에서 JNIEXPORT을 보았습니다 만, 단지 JNI이 아닙니다.이 사용법에 대해 더 자세히 알고 싶지만 Google에 어떤 행운을 가져다주지는 않았습니다.Superpowered Android JNI : 이해 "JNI (jintArray ..."형식

C++ Code :

// This is called by the MainActivity Java object periodically. 
JNI(jintArray, getLatestMidiMessage, PID)(JNIEnv *env, jobject __unused obj) { 
    jintArray ints = env->NewIntArray(4); 
    jint *i = env->GetIntArrayElements(ints, NULL); 
    pthread_mutex_lock(&mutex); 
    i[0] = latestMidiCommand; 
    i[1] = latestMidiChannel; 
    i[2] = latestMidiNumber; 
    i[3] = latestMidiValue; 
    pthread_mutex_unlock(&mutex); 
    env->ReleaseIntArrayElements(ints, i, NULL); 
    return ints; 
} 

Java code : 이 예제의 코드에서

// Update UI every 40 ms. 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       int[] midi = getLatestMidiMessage(); 
       switch (midi[0]) { 
        case 8: textView.setText(String.format(Locale.ENGLISH, "Note Off, CH %d, %d, %d", midi[1] + 1, midi[2], midi[3])); break; 
        case 9: textView.setText(String.format(Locale.ENGLISH, "Note On, CH %d, %d, %d", midi[1] + 1, midi[2], midi[3])); break; 
        case 11: textView.setText(String.format(Locale.ENGLISH, "Control Change, CH %d, %d, %d", midi[1] + 1, midi[2], midi[3])); break; 
       } 
       handler.postDelayed(this, 40); 
      } 
     }; 
     handler = new Handler(); 
     handler.postDelayed(runnable, 40); 
    } 

답변

3

봐 :

// Beautifying the ugly Java-C++ bridge (JNI) with these macros. 
#define PID com_superpowered_simpleusb_SuperpoweredUSBAudio // Java package name and class name. Don't forget to update when you copy this code. 
#define MAKE_JNI_FUNCTION(r, n, p) extern "C" JNIEXPORT r JNICALL Java_ ## p ## _ ## n 
#define JNI(r, n, p) MAKE_JNI_FUNCTION(r, n, p) 

그는 일 "청소기"를 만들기 위해 몇 가지 매크로 마법을 사용하고. 현실에서는 이해하기가 쉽지 않지만 생산 코드에는 이와 같은 내용이 없어야합니다.

+0

정말 JNIEXPORT 변장입니다! 감사! – user1147171