27

これらのガイドに従って、LAME ライブラリを使用して Android に MP3 エンコーディングを実装しようとしてい ます 。 -Android-with-JNI

ただし、パッケージ名にピリオドとして解釈されるアンダースコアが含まれていることが原因であると思われる java.lang.UnsatisfiedLinkError が発生しています。

以下の私のコードを見ると、これはおそらくこの問題であり、どうすればそれを回避できますか。または、これを引き起こしている何か他のものがあります。助けてくれてありがとう。

Record.java :

package co.uk.ing_simmons.aberdeensoundsites;

public class Record extends Activity implements OnClickListener {

static {
    System.loadLibrary("mp3lame");
}

private native void initEncoder(int numChannels, int sampleRate, int bitRate, int mode, int quality);

private native void destroyEncoder();

private native int encodeFile(String sourcePath, String targetPath);

[.....]
}

wrapper.c :

void Java_co_uk_ing_simmons_aberdeensoundsites_Record_initEncoder(JNIEnv *env,
        jobject jobj, jint in_num_channels, jint in_samplerate, jint in_brate,
        jint in_mode, jint in_quality) {
[....]

完全なログの猫のエラー:

04-17 20:58:36.009: E/AndroidRuntime(26768): FATAL EXCEPTION: main
04-17 20:58:36.009: E/AndroidRuntime(26768): java.lang.UnsatisfiedLinkError: initEncoder
04-17 20:58:36.009: E/AndroidRuntime(26768):    at co.uk.ing_simmons.aberdeensoundsites.Record.initEncoder(Native Method)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at co.uk.ing_simmons.aberdeensoundsites.Record.onCreate(Record.java:79)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at android.os.Looper.loop(Looper.java:123)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at android.app.ActivityThread.main(ActivityThread.java:3687)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at java.lang.reflect.Method.invokeNative(Native Method)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at java.lang.reflect.Method.invoke(Method.java:507)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
04-17 20:58:36.009: E/AndroidRuntime(26768):    at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

52

アンダースコアの後に数字の 1 を付ける必要があります。したがって、パッケージ名に ing_simmons が含まれている場合、JNI はそのように形成されます。

void Java_co_uk_ing_1simmons_aberdeensoundsites_Record_initEncoder

これは、Java ファイルのクラス名やメソッド名など、呼び出しの他の部分にアンダースコアがある場合にも当てはまります。

于 2013-04-17T20:28:56.583 に答える
16

_1ルールに関する JNI 仕様の引用

scriptocalypseが言及している_1ルールは、JNI 仕様 8 Chapter 2: Design Overview - Resolving Native Method Names の一部です。

Escape Sequence     Denotes
_1                  the character “_” 
于 2016-01-26T14:01:20.387 に答える