Неудовлетворенная ошибка ссылки в родном вызове 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");
}
}
native.h
#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): добавлен общий lib /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): эмулятор без эмуляции 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): завершение работы виртуальной машины 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): на 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): на андроид.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): добавлен общий lib /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): обнаружен эмулятор без эмуляции графического процессора.
08-03 17: 58: 54.040: D/dalvikvm(4007): Попытка загрузить lib /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e7008-03 17: 58: 54.050: D/dalvikvm(4007): добавлена общая библиотека lib /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e7008-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 -D ../libs/armeabi/libmp3lame.so | grep hello
0001c4e9 T Java_com_example_rockboost_MainActivity_hello
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
каталог.