LoginSignup
8
9

More than 5 years have passed since last update.

パッケージにアンダースコアが入っていた場合にJNI関連でハマったのでメモ

Last updated at Posted at 2013-11-23

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。

そういえば、"_"の事をアンダースコアじゃなくてアンダーバーって言う事が多いけど、和製英語らしいね。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9