android.mk 依赖项目,android - 当本机共享库依赖静态库时,如何将基于Android.mk文件的Android NDK项目迁移到Gradle? - 堆栈内存溢出...

我有一个Android NDK项目,该项目可与Android.mk文件一起构建并运行良好,它包含作为共享库构建的本机代码(一个C文件),此代码对第三方静态库(.a文件)具有依赖性。

现在,我正在尝试将其迁移到Gradle。 我当前的配置如下:

/static_libs folder下的静态库Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := opus

LOCAL_SRC_FILES := lib/libopus.a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_STATIC_LIBRARY)

主模块Android.mk文件:(在通常的jni /文件夹下)

LOCAL_PATH := $(call my-dir)

$(call import-add-path,$(LOCAL_PATH)/../static_libs)

include $(CLEAR_VARS)

LOCAL_MODULE:=opus_jni

LOCAL_SRC_FILES:= opus_jni.c

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -ldl

LOCAL_WHOLE_STATIC_LIBRARIES := opus

include $(BUILD_SHARED_LIBRARY)

$(call import-module,opus)

当我在主模块上运行ndk-build时,唯一的输出是一个文件libopus_jni.so ,这是唯一用于构建最终APK的文件。

现在在Gradle上,我现在唯一要做的就是使用相同的预构建共享库和相同的代码创建一个APK,因此我将生成的库复制到jniLibs/文件夹中(我知道从0.9开始,Gradle已支持JNI库,如果文件放在这里) 。 该项目已构建,最终的APK确实在libs/文件夹中包含.so文件。 (我通过解压缩生成的APK进行了验证)

问题是,当我尝试使用任何本机方法时,都会出现以下错误:

05-28 14:57:53.393 3370-3370/com.opusgradle.app D/OB-OpusCodec﹕ testPcmToOpus()

05-28 14:57:53.393 3370-3370/com.opusgradle.app D/dalvikvm﹕ Trying to load lib /data/app-lib/com.opusgradle.app-2/libopus_jni.so 0x42630b18

05-28 14:57:53.393 3370-3370/com.opusgradle.app D/dalvikvm﹕ Added shared lib /data/app-lib/com.opusgradle.app-2/libopus_jni.so 0x42630b18

05-28 14:57:53.393 3370-3370/com.opusgradle.app D/OB-OpusCodec﹕ Trying to initialize...

05-28 14:57:53.393 3370-3370/com.opusgradle.app W/dalvikvm﹕ No implementation found for native Lcom/opusgradle/app/OpusCodec;.initOpusEncoder:(II)V

05-28 14:57:53.393 3370-3370/com.opusgradle.app D/AndroidRuntime﹕ Shutting down VM

05-28 14:57:53.393 3370-3370/com.opusgradle.app W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x415e0ba8)

05-28 14:57:53.393 3370-3370/com.opusgradle.app E/AndroidRuntime﹕ FATAL EXCEPTION: main

Process: com.opusgradle.app, PID: 3370

java.lang.UnsatisfiedLinkError: Native method not found: com.opusgradle.app.OpusCodec.initOpusEncoder:(II)V

at com.opusgradle.app.OpusCodec.initOpusEncoder(Native Method)

at com.opusgradle.app.OpusCodec.(OpusCodec.java:23)

at com.opusgradle.app.MainActivity.testPcmToOpus(MainActivity.java:78)

at com.opusgradle.app.MainActivity.access$000(MainActivity.java:22)

at com.opusgradle.app.MainActivity$1.onClick(MainActivity.java:64)

at android.view.View.performClick(View.java:4438)

at android.view.View$PerformClick.run(View.java:18422)

at android.os.Handler.handleCallback(Handler.java:733)

at android.os.Handler.dispatchMessage(Handler.java:95)

at android.os.Looper.loop(Looper.java:136)

at android.app.ActivityThread.main(ActivityThread.java:5017)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:515)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)

at dalvik.system.NativeStart.main(Native Method)

如您所见, .so文件已找到并加载,但对本机函数的调用失败。 Java代码与可以正常工作的原始项目相同,基本上对库的调用如下所示:

static

{

System.loadLibrary("opus_jni");

}

看来,当需要静态库时,Gradle需要将其他内容复制到jniLibs文件夹中,我也尝试将.a文件复制到jniLibs/文件夹中也没有成功。

对于具有静态库依赖关系的预构建共享库,是否还有其他要求才能在Gradle上正确构建?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值