2013-07-09 28 views
2

我有一個本地庫,它可以在我的android應用程序中通過ndk正常工作。現在我需要用這個庫編譯android。但是當我嘗試這樣做時,我遇到了一些神祕的錯誤。Android構建系統。本機庫。編譯時出現很多代碼錯誤

target thumb C++: md5b <= external/libmd5b/jni/md5b.cpp 
target thumb C++: md5b <= external/libmd5b/jni/md5.cpp 
external/libmd5b/jni/md5b.cpp:2:18: error: string: No such file or directory 
external/libmd5b/jni/md5b.cpp:3:20: error: iostream: No such file or directory 
external/libmd5b/jni/md5b.cpp:4:19: error: fstream: No such file or directory 
In file included from external/libmd5b/jni/md5.cpp:2: 
external/libmd5b/jni/md5.h:5:20: error: iostream: No such file or directory 
external/libmd5b/jni/md5.cpp:6:18: error: string: No such file or directory 
In file included from external/libmd5b/jni/md5b.cpp:6: 
external/libmd5b/jni/md5.h:23: error: expected unqualified-id before '&' token 
external/libmd5b/jni/md5.h:23: error: expected ')' before '&' token 
external/libmd5b/jni/md5.h:23: error: expected ';' before '&' token 
external/libmd5b/jni/md5.h:27: error: 'string' in namespace 'std' does not name a type 
external/libmd5b/jni/md5.h:28: error: ISO C++ forbids declaration of 'ostream' with no type 
external/libmd5b/jni/md5.h:28: error: 'ostream' is neither function nor member function; cannot be declared friend 
external/libmd5b/jni/md5.h:28: error: expected ';' before '&' token 
external/libmd5b/jni/md5.h:58: error: 'string' in namespace 'std' does not name a type 
external/libmd5b/jni/md5b.cpp: In function '_jstring* Md5B(JNIEnv*, _jobject*, _jstring*)': 
external/libmd5b/jni/md5b.cpp:18: error: 'string' is not a member of 'std' 
external/libmd5b/jni/md5b.cpp:18: error: expected ';' before 'strpath' 
external/libmd5b/jni/md5b.cpp:19: error: 'ifstream' was not declared in this scope 
external/libmd5b/jni/md5b.cpp:19: error: expected ';' before 'inFile' 
external/libmd5b/jni/md5b.cpp:20: error: 'inFile' was not declared in this scope 
external/libmd5b/jni/md5b.cpp:20: error: 'strpath' was not declared in this scope 
external/libmd5b/jni/md5b.cpp:21: error: 'string' is not a member of 'std' 
external/libmd5b/jni/md5b.cpp:21: error: expected ';' before 'line' 
external/libmd5b/jni/md5b.cpp:22: error: 'string' is not a member of 'std' 
external/libmd5b/jni/md5b.cpp:22: error: expected ';' before 'strFile' 
external/libmd5b/jni/md5b.cpp:25: error: 'line' was not declared in this scope 
external/libmd5b/jni/md5b.cpp:25: error: 'getline' was not declared in this scope 
external/libmd5b/jni/md5b.cpp:26: error: 'strFile' was not declared in this scope 
external/libmd5b/jni/md5b.cpp:29: error: 'string' is not a member of 'std' 
external/libmd5b/jni/md5b.cpp:29: error: expected ';' before 'md5R' 
external/libmd5b/jni/md5b.cpp:30: error: 'md5R' was not declared in this scope 
make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/md5b_intermediates/md5b.o] Error 1 
make: *** Waiting for unfinished jobs.... 
In file included from external/libmd5b/jni/md5.cpp:2: 
external/libmd5b/jni/md5.h:23: error: expected unqualified-id before '&' token 
external/libmd5b/jni/md5.h:23: error: expected ')' before '&' token 
external/libmd5b/jni/md5.h:23: error: expected ';' before '&' token 
external/libmd5b/jni/md5.h:27: error: 'string' in namespace 'std' does not name a type 
external/libmd5b/jni/md5.h:28: error: ISO C++ forbids declaration of 'ostream' with no type 
external/libmd5b/jni/md5.h:28: error: 'ostream' is neither function nor member function; cannot be declared friend 
external/libmd5b/jni/md5.h:28: error: expected ';' before '&' token 
external/libmd5b/jni/md5.h:58: error: 'string' in namespace 'std' does not name a type 
external/libmd5b/jni/md5.cpp:79: error: expected unqualified-id before '&' token 
external/libmd5b/jni/md5.cpp:79: error: expected ')' before '&' token 
external/libmd5b/jni/md5.cpp:79: error: expected initializer before '&' token 
external/libmd5b/jni/md5.cpp:303: error: 'string' in namespace 'std' does not name a type 
external/libmd5b/jni/md5.cpp:318: error: expected constructor, destructor, or type conversion before '&' token 
external/libmd5b/jni/md5.cpp:325: error: 'string' in namespace 'std' does not name a type 
make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/md5b_intermediates/md5.o] Error 1 

它看起來像我在我的代碼中的錯誤,但我確信,相反,因爲相同的代碼在我的應用程序工作正常。

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_CFLAGS := -fPIC 

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

LOCAL_MODULE := md5b 

LOCAL_SRC_FILES := md5b.cpp md5.cpp 

LOCAL_MODULE_TAGS := optional 

include $(BUILD_SHARED_LIBRARY) 

Application.mk

部分
APP_STL:=stlport_static 
APP_MODULES := md5b 

./build/target/product/full.mk

PRODUCT_PACKAGES := \ 
    Camera \ 
libmd5b 

md5b.cpp

#include <jni.h> 

#include <string> 

#include <iostream> 

#include <fstream> 

#include <android/log.h> 

#include "md5.h" 

using namespace std; 



extern "C" { 

    JNIEXPORT jstring JNICALL Md5B //This function named without aplication_activity_etc because it should be visible system wide. Is it right syntax? 

    (JNIEnv * env, jobject obj, jstring fpath); 

}; 



JNIEXPORT jstring JNICALL Md5B 

(JNIEnv * env, jobject obj, jstring fpath) 

{ 



    std::string strpath = env->GetStringUTFChars(fpath, NULL); 

    ifstream inFile; 

    inFile.open(strpath.c_str()); 

    std::string line; 

    std::string strFile; 

    while (!inFile.eof()) 

    { 

     getline(inFile, line); 

     strFile += line; 

    } 

    inFile.close(); 

    std::string md5R = md5(strFile); 

    char* chmd5R = new char [md5R.length()]; 

    strcpy (chmd5R, md5R.c_str()); 

    return env->NewStringUTF(chmd5R); 

} 

在這裏您可以檢查其他庫文件:md5.cppmd5.h

我錯過了什麼,以及如何解決它?

回答

2

在Android構建樹(而不是NDK)中構建本機代碼時,您沒有自動STL支持。您必須手動添加STL頭文件和庫文件,例如

LOCAL_STATIC_LIBRARIES += libstlport_static 
LOCAL_C_INCLUDES += external/stlport/stlport bionic/ bionic/libstdc++/include 
+0

我在Android.mk線加入這樣的: LOCAL_STATIC_LIBRARIES + = libstlport_static的libstdC++的libm的libc 但仍然有同樣的錯誤。 – Andrew

+0

您還需要LOCAL_C_INCLUDES中的STL標頭,對不起,我沒有明確提及。 –

+0

是的。圖書館已經編譯通過你的方式。沒有錯誤和警告。但是當我在/ system/lib中找不到它時,我感到困惑。但它應該是另一個問題。非常感謝你。 – Andrew

相關問題