1

JNI グルー コードを含む共有ライブラリから関連するシンボルを抽出しようとしていますが、nm は十分に役に立たないようです。メソッド シグネチャが存在しないため、どの引数を渡せばよいかわかりません。

何か案は?

bash-3.2# ./arm-linux-androideabi-nm -D ~/Desktop/backup/whiteBox/libamplayerjni.so | grep Java
00030d6c T Java_com_farcore_playerservice_AmPlayer_GL2XScale
00030da8 T Java_com_farcore_playerservice_AmPlayer_close
00030d74 T Java_com_farcore_playerservice_AmPlayer_disable2X2XYScale
...

obdump もあまり役に立ちません

bash-3.2# ./arm-linux-androideabi-objdump -TC ~/Desktop/backup/whiteBox/libamplayerjni.so | grep Java
00030c00 g    DF .text  00000008 Java_com_farcore_playerservice_AmPlayer_getDivxInfo
00030c08 g    DF .text  00000008 Java_com_farcore_playerservice_AmPlayer_setIVolume
00030c10 g    DF .text  00000008 Java_com_farcore_playerservice_AmPlayer_mute
00030c18 g    DF .text  00000008 Java_com_farcore_playerservice_AmPlayer_unmute
00030c20 g    DF .text  00000008 Java_com_farcore_playerservice_AmPlayer_setVideoBlackOut
4

1 に答える 1

3

JNI は C 呼び出し規則 (cdecl) を使用するため、関数シグネチャに引数情報はありません。引数の型を調べるには、対応する java(dalvik) コードを分析する必要があります。

ここに私のjniライブラリがあります:

00001408 g    DF .text  0000000a Java_info_kghost_android_openvpn_FileDescriptorHolder_close
00001a14 g    DF .text  00000198 Java_info_kghost_android_openvpn_ManagementSocket_read__ILjava_nio_ByteBuffer_2II
00001414 g    DF .text  0000000c Java_info_kghost_android_openvpn_ManagementSocket_shutdown
000017c4 g    DF .text  00000250 Java_info_kghost_android_openvpn_ManagementSocket_read__ILjava_nio_ByteBuffer_2IILinfo_kghost_android_openvpn_FileDescriptorHolder_2
0000142c g    DF .text  00000200 Java_info_kghost_android_openvpn_ManagementSocket_write__ILjava_nio_ByteBuffer_2IILinfo_kghost_android_openvpn_FileDescriptorHolder_2
00001420 g    DF .text  0000000a Java_info_kghost_android_openvpn_ManagementSocket_close
0000162c g    DF .text  00000198 Java_info_kghost_android_openvpn_ManagementSocket_write__ILjava_nio_ByteBuffer_2II
00001bd4 g    DF .text  000000d4 Java_info_kghost_android_openvpn_ManagementSocket_open

オーバーロード メソッドがない場合、署名には引数情報が含まれません。メソッドがオーバーロードされている場合、署名には関数名に引数情報が含まれます。

また、ネイティブ メソッドを使用する前に、jni ライブラリを明示的にロードする必要があります。

System.loadLibrary("your-library-name");

ライブラリがAndroid のLD_LIBRARY_PATH,/libディレクトリ内に配置されていることを確認し、mmap ( /proc/pid/maps) をチェックして、正常にロードされているかどうかを確認します。

于 2012-06-20T22:33:36.057 に答える