грешка при неудовлетворена връзка в основното повикване на android

Опитвам се да извикам собствена функция от клас на активност на 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");

    }

}

роден.ч

#include <jni.h>

JNIEXPORT void JNICALL Java_com_example_rockboost_MainActivity_hello(JNIEnv *, jobject);

native.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++;
}

catlogs

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

08-03 17:59:15.130: E/AndroidRuntime(4007): в com.example.rockboost.MainActivity.hello(Native Method) 08-03 17:59:15.130: E/AndroidRuntime(4007): в com.example .rockboost.MainActivity.boostMe(MainActivity.java:17) 08-03 17:59:15.130: E/AndroidRuntime(4007): на com.example.rockboost.MainActivity.access$0(MainActivity.java:15) 08-03 17:59:15.130: E/AndroidRuntime(4007): в com.example.rockboost.MainActivity$1.onClick(MainActivity.java:35) 08-03 17:59:15.130: E/AndroidRuntime(4007): в android. view.View.performClick(View.java:4450) 08-03 17:59:15.130: E/AndroidRuntime(4007): в android.view.View$PerformClick.run(View.java:18600) 08-03 17: 59:15.130: E/AndroidRuntime(4007): в android.os.Handler.handleCallback(Handler.java:733) 08-03 17:59:15.130: E/AndroidRuntime(4007): в android.os.Handler.dispatchMessage (Handler.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(Native метод) 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(Native Method) 08-03 18:04:16.680: I/Process(4007): Изпращане на сигнал. PID: 4007 SIG: 9 08-03 18:24:16.030: D/dalvikvm(5266): Опит за зареждане на lib /data/app-lib/com.example.rockboost-2/libhellomodule.so 0xb1c89f18 08-03 18: 24:16.410: D/dalvikvm(5266): Добавена споделена библиотека /data/app-lib/com.example.rockboost-2/libhellomodule.so 0xb1c89f18 08-03 18:24:16.410: D/dalvikvm(5266): Не JNI_OnLoad намерен в /data/app-lib/com.example.rockboost-2/libhellomodule.so 0xb1c89f18, пропускане на init 08-03 18:24:17.330: D/gralloc_goldfish(5266): Открит емулатор без GPU емулация.

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:59:15.040: W/dalvikvm(4007): Не е намерена реализация за родния Lcom/example /rockboost/MainActivity;.hello:()V

Библиотеката се компилира. Виждам в регистрационните файлове, че споделената библиотека може да бъде заредена. Обаче естественото повикване не работи и причинява грешка на неудовлетворена връзка

Конвенцията за именуване изглежда добре, доколкото виждам. Мога да стартирам приложението, грешката се случва само при извикване на основната функция. Също така се уверих, че библиотеката е създадена за правилния процесор/архитектура,

Актуализация

Пуснах 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

person Luke    schedule 03.08.2014    source източник
comment
Има ли вероятност инсталираната библиотека да е остаряла без последните ви промени? Може да почистите проекта и да го внедрите отново. Можете също да използвате objdump на ndk, за да се уверите, че функцията наистина е в .so (евентуално този, който можете да извлечете от apk с инструменти за zip файлове).   -  person Chris Stratton    schedule 03.08.2014
comment
Отворете своя APK като ZIP и извлечете libmp3lame.so от там. Стартирайте отново nm за този файл.   -  person Alex Cohn    schedule 04.08.2014


Отговори (1)


LOCAL_SRC_FILES трябва да бъде списък от C файлове. Във вашия случай изглежда е така

LOCAL_SRC_FILES = native.c

Когато стартирате ndk-build, ще го видите компилиран.

Има други грешки във вашия Android.mk.

APP_ABI е без значение там; поставете го в Application.mk или в командния ред.

LOCAL_C_INCLUDE е изписано неправилно; пише LOCAL_C_INCLUDES. Това изброява директории, където да търсите заглавни файлове. Във вашия случай това може да е път от вашия проект до директория mp3gain.

person Alex Cohn    schedule 04.08.2014