Система сборки Android. Родная библиотека. Много ошибок кода при компиляции

У меня есть одна собственная библиотека, которая отлично работает через ndk в моем приложении для 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.cpp и md5.h.

Что я упустил и как это исправить?


person Andrew    schedule 09.07.2013    source источник


Ответы (2)


Когда вы создаете собственный код в дереве сборки Android (не NDK), у вас нет автоматической поддержки STL. Вы должны добавить заголовки STL и библиотеку вручную, например.

LOCAL_STATIC_LIBRARIES += libstlport_static
LOCAL_C_INCLUDES += external/stlport/stlport bionic/ bionic/libstdc++/include
person Alex Cohn    schedule 09.07.2013
comment
Я добавил в свой Android.mk строку следующим образом: LOCAL_STATIC_LIBRARIES += libstlport_static libstdc++ libm libc, но все еще имеют те же ошибки. - person Andrew; 10.07.2013
comment
Вам также нужны заголовки STL в LOCAL_C_INCLUDES, извините, я не упомянул об этом явно. - person Alex Cohn; 10.07.2013
comment
да. Библиотека собрана вашим способом. Никаких ошибок и никаких предупреждений. Но я смутился, когда не нашел его в /system/lib. Однако это должен быть другой вопрос. Спасибо большое. - person Andrew; 10.07.2013

Это помогло мне легко начать используя стандартные строки.

Я создал Application.mk и добавил единственную строку:

APP_STL := stlport_static 

Затем я добавил #include <string> в свой файл CPP и создал строки, используя std::string s("Lorem");, поскольку using namespace считается плохой практикой.

Почему "используется пространство имен std;" считается плохой практикой?

C++: вопросы об использовании пространства имен std и cout [дубликат]

person Maksim Dmitriev    schedule 28.07.2014