简体   繁体   English

如何在android apk中添加第三方C库?

[英]How to add a third party C library in android apk?

I have a prebuild third party C library libliveplay.so, I want to add it to apk. 我有一个预构建的第三方C库libliveplay.so,我想将其添加到apk。 I put it under 我把它放在

libs/armeabi
libs/armeabi-v7a

and my android.mk file is like: 和我的android.mk文件是这样的:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := RtspPlayer
LOCAL_CERTIFICATE := platform
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false

LOCAL_SHARED_LIBRARIES := libliveplay

include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))

but it can't add the so into apk with this method, could anyone help? 但是它无法使用这种方法将其添加到apk中,有人可以帮忙吗?

When apk build out, I install it on my device, and runtime error happened: APK构建完毕后,我将其安装在设备上,并发生运行时错误:

E/AndroidRuntime( 4660): FATAL EXCEPTION: main
E/AndroidRuntime( 4660): java.lang.ExceptionInInitializerError
E/AndroidRuntime( 4660):    at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime( 4660):    at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime( 4660):    at android.app.Instrumentation.newActivity(Instrumentation.java:1064)
E/AndroidRuntime( 4660):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
E/AndroidRuntime( 4660):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
E/AndroidRuntime( 4660):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
E/AndroidRuntime( 4660):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
E/AndroidRuntime( 4660):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 4660):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 4660):    at android.app.ActivityThread.main(ActivityThread.java:5041)
E/AndroidRuntime( 4660):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 4660):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 4660):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime( 4660):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime( 4660):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 4660): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load liveplay from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.mrlans.play-2.apk,libraryPath=/data/app-lib/com.mrlans.play-2]: findLibrary returned null
E/AndroidRuntime( 4660):    at java.lang.Runtime.loadLibrary(Runtime.java:365)
E/AndroidRuntime( 4660):    at java.lang.System.loadLibrary(System.java:535)
E/AndroidRuntime( 4660):    at com.mrlans.play.MediaActivity.<clinit>(MediaActivity.java:152)
E/AndroidRuntime( 4660):    ... 15 more

The error indicated that the so did not include in the apk, it didn't install into system when apk installed. 该错误表明apk中未包含so,因此在安装apk后未将其安装到系统中。 please help. 请帮忙。

You need to include libliveplay as PREBUILT library. 您需要将libliveplay包含为PREBUILT库。 Place libliveplay.so in your /jni directory so the structure is as following: 将libliveplay.so放在/ jni目录中,因此结构如下:

Android.mk                 --> the file above
armeabi/libliveplay.so     --> the armeabi prebuilt shared library
armeabi-v7a/libliveplay.so --> the armeabi-v7a prebuilt shared library

Then in Android.mk 然后在Android.mk中

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := liveplay
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libliveplay.so
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := RtspPlayer
LOCAL_CERTIFICATE := platform
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false

LOCAL_SHARED_LIBRARIES := liveplay

include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM