我正在尝试从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):添加了共享库/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中找不到JNI_OnLoad,跳过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:线程退出未捕获异常(组= 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):at com.example.rockboost.MainActivity.hello(Native Method) 08-03 17:59:15.130:E / AndroidRuntime(4007):at 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):at 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):at java.lang.reflect.Method.invokeNative(Native Method) 08-03 17:59:15.130:E / AndroidRuntime(4007):at java.lang.reflect.Method.invoke(Method.java:515) 08-03 17:59:15.130:E / AndroidRuntime(4007):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:777) 08-03 17:59:15.130:E / AndroidRuntime(4007):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 08-03 17:59:15.130:E / AndroidRuntime(4007):at 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):在/data/app-lib/com.example.rockboost-2/libhellomodule.so 0xb1c89f18中找不到JNI_OnLoad,跳过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):在/data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70中找不到JNI_OnLoad,跳过init 08-03 17:59:15.040:W / dalvikvm(4007):找不到原生Lcom / example / rockboost / MainActivity的实现; .hello :()V
图书馆编译。我可以在日志中看到可以加载共享库。 但是,本机调用不起作用并导致无法解决的链接错误
就我所见,命名约定似乎很好。我可以启动应用程序只在调用本机函数时才会发生错误。我还确保库是为正确的cpu / architecture构建的,
我运行了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)
可能有些问题,但我不知道在哪里。
修正了我的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)
编译正常但结果相同,程序无法在库中找到该函数。 Altough nm显示符号在那里:
$ nm -D ../libs/armeabi/libmp3lame.so | grep hello
0001c4e9 T Java_com_example_rockboost_MainActivity_hello
答案 0 :(得分: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
目录的路径。