ошибка неудовлетворенной ссылки в собственном вызове 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");

    }

}

родной.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): попытка загрузить библиотеку /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, пропуск инициализации

08-03 17:58:55.700: D/gralloc_goldfish(4007): обнаружен эмулятор без эмуляции графического процессора. 08-03 17:59:15.040: W/dalvikvm(4007): не найдена реализация для собственного Lcom/example/rockboost/MainActivity;.hello:()V

08-03 17:59:15.050: D/AndroidRuntime(4007): завершение работы виртуальной машины 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(собственный метод) 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): at 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(собственный метод) 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): at 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): попытка загрузить 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, пропуская инициализацию 08-03 18:24:17.330: D/gralloc_goldfish(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): JNI_OnLoad не найден в /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70, пропуск инициализации 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