2017-01-04 4 views
1

Die Superpowered "" verwendet den folgenden Code, um die Benutzeroberfläche auf der Java-Seite basierend auf einer C++ - Methode zu aktualisieren. Dies ist das erste Mal, dass ich JNI gesehen habe Alleine gefolgt von einer Methode Ich habe JNIEXPORT in ähnlichen Situationen gesehen, aber nicht nur JNI. Ich würde gerne mehr über diese Verwendung erfahren, aber ich hatte kein Glück bei dem Versuch, es zu googlen. Irgendwelche Erklärungen oder Referenzen würden geschätzt werden!Superpowered Android JNI: Verständnis "JNI (jintArray ..." Format

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); 
    } 

Antwort

3

Blick auf den Code in diesem Beispiel:

// 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) 

Er hat einige Makro Magie Dinge "sauberer" zu machen. In Wirklichkeit macht es das weniger wortreich, aber viel schwieriger zu verstehen, und Produktionscode sollte niemals solche Sachen haben.

+0

So ist es wirklich nur JNIEXPORT in Verkleidung! Vielen Dank! – user1147171