2012-04-11 28 views
7

Từ this tutorial.Cách liên kết bất kỳ thư viện nào trong ứng dụng ndk

thấy tôi có một thư viện tĩnh trước khi xây dựng tên là stackoverflow.a và nó có stackoverflow.h

bây giờ tôi muốn sử dụng chức năng của thư viện tĩnh trong

ndk_demo.c // hướng dẫn có file này

cho rằng bên ndk_demo.c tôi đã thêm

#include 'stackoverflow.h' 

Sửa

inside `android-ndk-r7c` 
     | 
     apps 
     | 
     ndk_demo 
     | 
    ----------------- 
    |    | 
    project   Application.mk 
    | 
-------------------- 
|     | 
all other   | 
folder    jni 
        | 
------------------------------------------------------------------- 
    |    |      |   |    | 
ndk_demo.c  stackoverflow.h  lib com_marakana  Android.mk 
             |  _NativeLib.h 
             | 
          -------------------- 
          |     | 
          Android.mk   libstackoverflow.a 

Bây giờ Application.mk

APP_PROJECT_PATH := $(call my-dir)/project 
APP_MODULES  := ndk_demo stackover 

Bây giờ JNI/Android.mk

include $(call all-subdir-makefiles) 
LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := ndk_demo 
LOCAL_SRC_FILES := ndk_demo.c 
LOCAL_STATIC_LIBRARIES := stackover 
include $(BUILD_SHARED_LIBRARY) 

tại JNI/lib/Và roid.mk

LOCAL_PATH := $(call my-dir) 
    include $(CLEAR_VARS) 
    LOCAL_MODULE := stackover 
    LOCAL_SRC_FILES := libstackoverflow.a 
    include $(PREBUILT_STATIC_LIBRARY) 
    LOCAL_PATH := $(call my-dir) 

Bây giờ từ android-ndk-r7c thư mục tôi chạy

make APP=ndk_demo 

nó cho thấy tôi lỗi như

Android NDK: Building for application 'ndk_demo'  
make: *** No rule to make target `build/core/ndk_demo.c', needed by `out/apps/ndk_demo/armeabi/objs/ndk_demo/ndk_demo.o'. Stop. 

lý do tại sao điều này xảy ra tôi không nhận được?

nếu tôi bình luận

#include $(call all-subdir-makefiles) 

này từ jni/Android.mk sau đó nó cho thấy lỗi sau

Android NDK: Building for application 'ndk_demo'  
Compile thumb : ndk_demo <= ndk_demo.c 
SharedLibrary : libndk_demo.so 
./out/apps/ndk_demo/armeabi/objs/ndk_demo/ndk_demo.o: In function `Java_com_marakana_NativeLib_hello': 
/home/jeegar/android-ndk-r7c/apps/ndk_demo/project/jni/ndk_demo.c:10: undefined reference to `stackoverflowInit' 
collect2: ld returned 1 exit status 
make: *** [out/apps/ndk_demo/armeabi/libndk_demo.so] Error 1 
+0

Bạn có thể đăng lệnh biên dịch và liên kết xuất ra khỏi makefile không? – ams

+0

trùng lặp: http://stackoverflow.com/questions/6165813/using-my-own-prebuilt-shared-library-in-an-android-ndk-project – bitwise

+0

@Nick vui lòng xem cập nhật của tôi –

Trả lời

5

khi bạn nhận được "thực hiện: * Không có quy tắc để thực hiện mục tiêu 'something.c'", nó chỉ có nghĩa là nó không thể tìm thấy tập tin.

Tôi là một chút bối rối vì sao bạn đã tổ chức dự án của bạn như thế, nhưng nếu tôi đã tiến hành xây dựng dự án của bạn, tôi sẽ làm điều đó như sau:

(doesn't matter which directory) 
| 
-->(ndk_demo) 
-->-->(jni) 
-->-->-->Application.mk 
-->-->-->Android.mk 
-->-->-->com_marakana_NativeLib.h 
-->-->-->ndk_demo.c 
-->-->(stackoverflow) 
-->-->-->stackoverflow.h 
-->-->-->libstackoverflow.a 

Sau đó, tôi sẽ sử dụng sau makefile:

Android.mk:

LOCAL_PATH := $(call my-dir) 

### include stackoverflow as a prebuilt lib ### 

include $(CLEAR_VARS) 

LOCAL_MODULE   := stackoverflow-prebuilt 
LOCAL_SRC_FILES   := ../stackoverflow/libstackoverflow.a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../stackoverflow 

include $(PREBUILT_STATIC_LIBRARY) 

### build your ndk lib ### 

include $(CLEAR_VARS) 

LOCAL_MODULE := ndk_demo 
LOCAL_C_INCLUDES := $(LOCAL_PATH) \ 
        $(LOCAL_PATH)/../stackoverflow 
LOCAL_SRC_FILES := ndk_demo.c 

LOCAL_LDLIBS := -llog 
LOCAL_STATIC_LIBRARIES := stackoverflow-prebuilt 

include $(BUILD_SHARED_LIBRARY) 

Và sau đây:

Ứng dụng.mk:

APP_MODULES := ndk_demo 
APP_PLATFORM := android-8 

Rồi cuối cùng, tôi sẽ điều hướng đến thư mục (ndk_demo) và chạy ndk-build.

ndk-build là công cụ xây dựng của Android. Bạn nên sử dụng nó. Nó có thể được tìm thấy tại địa chỉ:

(AndroidSDK)/(NDK)/ndk-build 

nếu bạn đang sử dụng các cửa sổ, bạn sẽ hoặc là phải gõ đường dẫn đầy đủ của ndk-xây dựng vào giao diện điều khiển, hoặc thêm một biến môi trường vào hệ thống của bạn trước khi cố gắng chạy nó.

http://www.windows7hacker.com/index.php/2010/05/how-to-addedit-environment-variables-in-windows-7/

Các vấn đề liên quan