JNIでJavaコードからC++コードを呼びだそうとした時にちょっとハマったのでメモ。
通常、JNIでは以下のように指定してネイティブメソッドを呼び出す。
Hoge.java
package com.test.foo;
class Hoge {
private native void nativeMethod(final int param);
}
Java_com_test_foo_Hoge.cpp
JNIEXPORT void Java_com_test_foo_Hoge_nativeMethod(jint param) {
}
ハマった箇所
パッケージ名にアンダースコアが入った場合に、
Hoge.java
package com.test.foo_bar;
class Hoge {
private native void nativeMethod(final int param);
}
Java_com_test_foo_bar_Hoge.cpp
JNIEXPORT void Java_com_test_foo_bar_Hoge_nativeMethod(jint param) {
}
とすると、ネイティブメソッドが見つからないという内容のリンクエラーが発生する。
一時間ほど悩んだ末に、下記のページを見つけた。
Invoking JNI functions in Android package name containing underscore
C++側でメソッドを定義する場合はアンダースコアの後に1を付ける必要があるらしい。
Hoge.java
package com.test.foo_bar;
class Hoge {
private native void nativeMethod(final int param);
}
Java_com_test_foo_bar_Hoge.cpp
JNIEXPORT void Java_com_test_foo_1bar_Hoge_nativeMethod(jint param) {
}
これでOK。
そういえば、"_"の事をアンダースコアじゃなくてアンダーバーって言う事が多いけど、和製英語らしいね。