0

Android アクティビティ クラスからネイティブ関数を呼び出そうとしていますが、その結果、満足できないリンク エラーが発生します。活動はこちら。

package com.example.rockboos;
import android.os.Bundle;

import android.app.Activity;
import android.widget.Button;
import android.widget.Toast;
import android.view.View;
import android.view.View.OnClickListener;
public class MainActivity extends Activity {


    public native void hello();
    private void boostMe() 
    {
        hello();
    }

    private VolumeController volumeController;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.volumeController = new VolumeController(this);
        Button btn = (Button)findViewById(R.id.btn0);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                    //volumeController.boost();
                boostMe();




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

    }

}

ネイティブ.h

#include <jni.h>

JNIEXPORT void JNICALL Java_com_example_rockboost_MainActivity_hello(JNIEnv *, jobject);

ネイティブ.c:

#include "mp3gain/mp3gain.h"

#include "native.h"

JNIEXPORT void JNICALL Java_com_example_rockboost_MainActivity_hello(JNIEnv *jniEnv, jobject thiz)
{
    //changeGain("/sdcard0/test.mp3", 10, 10);
    int x = 0;
    x++;
}

カタログ

08-03 17:58:54.040: D/dalvikvm(4007): lib /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70 を読み込もうとしています

08-03 17:58:54.050: D/dalvikvm(4007): 共有ライブラリ /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70 を追加しました

08-03 17:58:54.050: D/dalvikvm(4007): JNI_OnLoad が /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70 に見つかりません、init をスキップします

08-03 17:58:55.700: D/gralloc_goldfish(4007): GPU エミュレーションなしのエミュレーターが検出されました。08-03 17:59:15.040: W/dalvikvm(4007): ネイティブ Lcom/example/rockboost/MainActivity の実装が見つかりません;.hello:()V

08-03 17:59:15.050: D/AndroidRuntime(4007): VM をシャットダウンしています 08-03 17:59:15.050: W/dalvikvm(4007): threadid=1: キャッチされない例外で終了するスレッド (group=0xb1a4ed70)

08-03 17:59:15.130: E/AndroidRuntime(4007): 致命的な例外: メイン

08-03 17:59:15.130: E/AndroidRuntime (4007): プロセス: com.example.rockboost、PID: 4007

08-03 17:59:15.130: E/AndroidRuntime(4007): java.lang.UnsatisfiedLinkError: ネイティブ メソッドが見つかりません: com.example.rockboost.MainActivity.hello:()V

java:95) 08-03 17:59:15.130: E/AndroidRuntime(4007): android.os.Looper.loop(Looper.java:136) 08-03 17:59:15.130: E/AndroidRuntime(4007) : android.app.ActivityThread.main(ActivityThread.java:5026) 08-03 17:59:15.130: E/AndroidRuntime(4007): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 08-03 17 :59:15.130: E/AndroidRuntime(4007): java.lang.reflect.Method.invoke(Method.java:515) 08-03 17:59:15.130: E/AndroidRuntime(4007): com.android. internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 08-03 17:59:15.130: E/AndroidRuntime(4007): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) ) 08-03 17:59:15.130: E/AndroidRuntime(4007): dalvik.system.NativeStart.main(ネイティブ メソッド) 08-03 18:04:16.680: I/Process(4007): シグナルを送信しています。PID: 4007 SIG: 9 08-03 18:24:16.030: D/dalvikvm (5266):

08-03 17:58:54.040: D/dalvikvm(4007): ライブラリをロードしようとしています /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70 08-03 17:58:54.050: D/ dalvikvm(4007): 共有ライブラリ /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70 08-03 17:58:54.050 を追加しました: D/dalvikvm(4007): /data/ に JNI_OnLoad が見つかりませんapp-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70、init 08-03 17:59:15.040 をスキップ: W/dalvikvm(4007): ネイティブ Lcom/example/rockboost/MainActivity の実装が見つかりません;.hello :()V

ライブラリがコンパイルされます。共有ライブラリをロードできたことをログで確認できます。ただし、ネイティブ呼び出しは機能せず、未飽和リンク エラーが発生しました

私が見る限り、命名規則は問題ないようです。ネイティブ関数を呼び出すときにのみエラーが発生するアプリケーションを起動できます。また、ライブラリが正しい CPU/アーキテクチャ用に構築されていることも確認しました。

アップデート

objdump -t を実行して、シンボル テーブルを確認しました。

$ objdump.exe -t libhellomodule.so

libhellomodule.so:     file format elf32-little

SYMBOL TABLE:
no symbols

関数はライブラリにありませんが、その理由はわかりません。ここに私の Android.mk ファイルがあります:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -llog

LOCAL_MODULE    := hellomodule
LOCAL_SRC_FILES := mp3gain mp3gain/mpglibDBL  

LOCAL_C_INCLUDE :=  mp3gain mp3gain/mpglibDBL native.h


APP_ABI := armeabi

include $(BUILD_SHARED_LIBRARY)

おそらく何か問題があるのでしょうが、どこにあるのかわかりません。

更新 2

私の Android.mk を修正し、別のライブラリを使用しました

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mp3lame
LOCAL_SRC_FILES := bitstream.c fft.c id3tag.c mpglib_interface.c presets.c quantize.c reservoir.c tables.c util.c VbrTag.c encoder.c gain_analysis.c lame.c newmdct.c psymodel.c quantize_pvt.c set_get.c takehiro.c vbrquantize.c version.c native.c   


include $(BUILD_SHARED_LIBRARY)

正常にコンパイルされますが、同じ結果で、プログラムはライブラリ内の関数を見つけることができません。nm は、シンボルがそこにあることを示しています。

$ nm -D ../libs/armeabi/libmp3lame.so | grep hello
0001c4e9 T Java_com_example_rockboost_MainActivity_hello
4

1 に答える 1

1

LOCAL_SRC_FILESC ファイルのリストでなければなりません。あなたの場合、それは

LOCAL_SRC_FILES = native.c

を実行するndk-buildと、コンパイルされていることがわかります。

Android.mkには他にも間違いがあります。

APP_ABIそこでは無関係です。Application.mkまたはコマンド ラインに配置します。

LOCAL_C_INCLUDEつづりが間違っています。LOCAL_C_INCLUDESを読み取ります。これは、ヘッダー ファイルを検索するディレクトリを一覧表示します。あなたの場合、それはあなたのプロジェクトからmp3gainディレクトリへのパスかもしれません。

于 2014-08-04T04:55:24.510 に答える