1

超级强大的“简单 USB 示例”使用以下代码基于 C++ 方法更新 Java 端的 UI。这是我第一次看到JNI一个人跟着一个方法。我见过JNIEXPORT类似的情况,但不仅仅是JNI。我想了解更多关于这种用法的信息,但没有任何运气尝试谷歌它。任何解释或参考将不胜感激!

C++ 代码

// 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代码

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

1 回答 1

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)

他正在使用一些宏观魔法让事情变得“更干净”。实际上,它使它变得不那么罗嗦,但更难理解,生产代码不应该有这样的东西。

于 2017-01-04T15:50:18.433 回答