JNIの関数名は長い
普段プログラミングするときは識別子が長くなりすぎないよう気を遣っている。
だが JNI(Java Native Interface) では、System.loadLibrary でC/C++関数を使えるようにするためにも長い関数名にせざるを得ないのだ。
example
JNIEXPORT void JNICALL Java_com_example_araki_app_jniBridge_nativeOnSurfaceChanged(JNIEnv* env, jobject obj, jint height, jint width);
エディタを横に分割すると宣言が収まり切れなくなることがある。
関数宣言が途中で改行されると、ただでさえ読みづらいのに見栄えも悪くなる。
解決策
C言語のマクロを使う。
macro
# define JniFuncVoid(return_type, func_name) \
JNIEXPORT return_type JNICALL \
Java_com_example_araki_app_jniBridge_##func_name \
(JNIEnv* env, jobject obj)
# define JniFuncArg(return_type, func_name, ...) \
JNIEXPORT return_type JNICALL \
Java_com_example_araki_app_jniBridge_##func_name \
(JNIEnv* env, jobject obj, __VA_ARGS__)
JniFuncArg(void, nativeOnSurfaceChanged, jint height, jint width);
return_type
関数の戻り値の型
func_name
関数名の共通していない部分
...
関数の共通していない引数
JniFuncVoid
は引数なし
JniFuncArg
は引数あり
C++20で追加される __VA_OPT__
が使えればマクロを一つにまとめられる。