use prebuild static lib on another android project

来源:互联网 发布:linux redhat中文乱码 编辑:程序博客网 时间:2024/05/22 04:45

前言

在NDK EXE工程中, 使用另外一个android静态库工程编译出来的静态库.a.
在android-ndk-r10e\samples中找了下,并没有这种用法。
上网找了下,有人做过了. 主要是EXE工程的.mk写法不同.

试验记录

静态库工程

// hw\lib\StaticLib1\jni\StaticLib1.cpp#include <jni.h>extern "C" int fn_test_add(int x, int y) {    return (x + y);}
# hw\lib\StaticLib1\jni\Android.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := StaticLib1LOCAL_SRC_FILES := StaticLib1.cppinclude $(BUILD_STATIC_LIBRARY)
# hw\lib\StaticLib1\jni\Application.mk# release for armAPP_ABI := armeabi-v7a# HM1SC is 4.4.4 android-19APP_PLATFORM := android-19

在 hw\lib\StaticLib1\jni\ 中运行ndk-build
编译出来的静态库在 hw\lib\StaticLib1\obj\local\armeabi-v7a\libStaticLib1.a
将 libStaticLib1.a 拷贝到 forRelease备用, 其它工程要用libStaticLib1.a时,就从forRelease目录直接拷贝,不用再编译了.

EXE工程

// hw\exe\MainTest\jni\MainTest.cpp#include <jni.h>#include <stdlib.h>#include <stdio.h>extern "C" int fn_test_add(int x, int y);extern "C" int main(int argc, char** argv) {    int x = 1;    int y = 2;    int sum = fn_test_add(1, 2);    printf("%d = fn_test_add(%d,%d)\r\n", sum, x, y);    return 0;}
# hw\exe\MainTest\jni\Android.mkLOCAL_PATH := $(call my-dir)# prepare libXinclude $(CLEAR_VARS)LOCAL_MODULE    := libStaticLib1LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libStaticLib1.ainclude $(PREBUILT_STATIC_LIBRARY)# main proginclude $(CLEAR_VARS)LOCAL_STATIC_LIBRARIES := libStaticLib1LOCAL_MODULE    := MainTestLOCAL_SRC_FILES := MainTest.cppinclude $(BUILD_EXECUTABLE)
# hw\exe\MainTest\jni\Application.mk# release for armAPP_ABI := armeabi-v7a# HM1SC is 4.4.4 android-19APP_PLATFORM := android-19

先编译一下EXE工程,看看静态库要放哪个位置才合适
在 hw\exe\MainTest\jni 运行 ndk-build

D:\ls\hw\exe\MainTest\jni>ndk-buildAndroid NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in D:/ls/hw/exe/MainTest/AndroidManifest.xmlAndroid NDK: ERROR:D:/ls/hw/exe/MainTest/jni/Android.mk:StaticLib1: LOCAL_SRC_FILES points to a missing fileAndroid NDK: Check that D:/ls/hw/exe/MainTest/jni/armeabi-v7a/libStaticLib1.a exists  or that its path is correctD:/android-ndk-r10e/build/core/prebuilt-library.mk:45: *** Android NDK: Aborting    .  Stop.

将开始备份(或者别人给的, 没有源码)的libStaticLib1.a拷贝出来, 根据报错提示, 将libStaticLib1.a放到/jni/armeabi-v7a下,再次运行ndk-build

D:\ls\hw\exe\MainTest\jni>ndk-buildAndroid NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in D:/ls//hw/exe/MainTest/AndroidManifest.xml[armeabi-v7a] Compile++ thumb: MainTest <= MainTest.cpp[armeabi-v7a] Executable     : MainTest[armeabi-v7a] Install        : MainTest => libs/armeabi-v7a/MainTest

测试

编译成功了, 将编译出的MainTest用adb放到真机上跑一下,看看正常不?

d:\tmp>adb devicesList of devices attachede73c0da deviced:\tmp>adb -s e73c0da push test.txt /data/local/tmp0 KB/s (12 bytes in 0.015s)d:\tmp>adb -s e73c0da shellshell@armani:/ $ cd /data/local/tmpshell@armani:/data/local/tmp $ lsMainTesttext.txtshell@armani:/data/local/tmp $ chmod 700 ./MainTestshell@armani:/data/local/tmp $ ls -l-rwx------ shell    shell        9432 2016-05-30 21:48 MainTest-rw-rw-rw- shell    shell          12 2016-05-21 16:08 test.txtshell@armani:/data/local/tmp $ ./MainTest3 = fn_test_add(1,2)shell@armani:/data/local/tmp $

根据执行EXE的测试结果,可以看出EXE调用.a成功.

0 0