java — сверхспособный JNI для Android: понимание формата JNI (jintArray …)

Сверхспособность «Простой пример USB«использует приведенный ниже код для обновления пользовательского интерфейса на стороне Java на основе метода C ++. Это первый раз, когда я видел JNI в одиночку с последующим методом. я видел JNIEXPORT в похожих ситуациях, но не только JNI, Я хотел бы узнать больше об этом использовании, но мне не повезло, пытаясь Google его. Любые объяснения или ссылки будут оценены!

Код 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);
}

1

Решение

Посмотрите на код в этом примере:

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

Он использует макро-магию, чтобы сделать вещи «чище». На самом деле это делает его менее многословным, но гораздо труднее для понимания, и у производственного кода никогда не должно быть подобных вещей.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]