use prebuild static lib on another android project

前言

在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.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := StaticLib1
LOCAL_SRC_FILES := StaticLib1.cpp

include $(BUILD_STATIC_LIBRARY)
# hw\lib\StaticLib1\jni\Application.mk
# release for arm
APP_ABI := armeabi-v7a

# HM1SC is 4.4.4 android-19
APP_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.mk

LOCAL_PATH := $(call my-dir)

# prepare libX
include $(CLEAR_VARS)
LOCAL_MODULE    := libStaticLib1
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libStaticLib1.a
include $(PREBUILT_STATIC_LIBRARY)

# main prog
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libStaticLib1

LOCAL_MODULE    := MainTest
LOCAL_SRC_FILES := MainTest.cpp

include $(BUILD_EXECUTABLE)
# hw\exe\MainTest\jni\Application.mk

# release for arm
APP_ABI := armeabi-v7a

# HM1SC is 4.4.4 android-19
APP_PLATFORM := android-19

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

D:\ls\hw\exe\MainTest\jni>ndk-build
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in D:/ls/hw/exe
/MainTest/AndroidManifest.xml
Android NDK: ERROR:D:/ls/hw/exe/MainTest/jni/Android.mk:StaticLib1: LOCAL_SRC_FILES points to a miss
ing file
Android NDK: Check that D:/ls/hw/exe/MainTest/jni/armeabi-v7a/libStaticLib1.a exists  or that its pa
th is correct
D:/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-build
Android 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 devices
List of devices attached
e73c0da device

d:\tmp>adb -s e73c0da push test.txt /data/local/tmp
0 KB/s (12 bytes in 0.015s)

d:\tmp>adb -s e73c0da shell
shell@armani:/ $ cd /data/local/tmp
shell@armani:/data/local/tmp $ ls
MainTest
text.txt
shell@armani:/data/local/tmp $ chmod 700 ./MainTest
shell@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.txt
shell@armani:/data/local/tmp $ ./MainTest
3 = fn_test_add(1,2)
shell@armani:/data/local/tmp $

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值