我正在尝试使用NDK在我的Android应用程序中使用boost库.我在这里和这里找到了几个成功案例,但我不能对我说同样的话.我特意尝试在此链接中使用库,以及boost线程库.在下面的代码中,我只是尝试包含线程库,而不是数学库.我用来构建boost库的过程与我附加的第一个链接几乎相同.
到目前为止,似乎我已经成功构建了boost库,但是当我运行时ndk-build,我收到以下错误:
Prebuilt : libboost_thread.a <= <NDK>/sources/
cp: omitting directory `path/to/ndk/sources/boost'
make: *** [obj/local/armeabi/libboost_thread.a] Error 1
Run Code Online (Sandbox Code Playgroud)
显然这cp: omitting directory...不是一个错误.但我唯一能得到的就是下一行,这并不是什么意思.Error 1
这是我的Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := boost_thread
LOCAL_LDLIBS := lboost_system-gcc-md lboost_thread-gcc-md -lgnustl_static
LOCAL_LDLIBS += lboost_system-gcc-md lboost_thread-gcc-md \
-L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi \
-lgnustl_static
LOCAL_SRC_FILES := #cpp_sources
LOCAL_MODULE := com_example_ndkFile_CppMethods
include $(BUILD_SHARED_LIBRARY)
$(call import-module,boost)
Run Code Online (Sandbox Code Playgroud)
并且还有一个Android.mk文件path/to/ndk/sources/boost/:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= boost_thread
LOCAL_SRC_FILES:= android/lib/libboost_thread.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include …Run Code Online (Sandbox Code Playgroud) 我正在尝试从存储在 android 项目的资产文件夹中的文本文件创建输入流,但遇到了一些问题。仅像在常规桌面程序(使用ifstream file_handle; file_handle.open("path/to/fileName");)中那样提供文件路径就足够了,还是必须以其他方式将其加载到应用程序中?如果是后者,那么在 ndk 中执行此操作的代码是什么?我还能将文件用作ifstream对象吗?
谢谢,
交换
我认为迭代器对象的想法是你可以类似地将它应用于C++容器类.但是,当我尝试遍历列表对象时,我尝试使用
for(list<int>::iterator it = obj.begin(); it < obj.end(); it++){
// some code
}
Run Code Online (Sandbox Code Playgroud)
我收到了一个错误.为什么这不起作用?它为什么会起作用vector::iterator?是仅仅因为列表的实现是双向链表?我认为迭代器对象抽象了通过容器移动的概念,从而允许它在操作上是相同的,无论是向量还是列表.
我真的很感激澄清.
我创建了一个包含变量信息的结构,即它们的名称和编号
struct var{
string name;
int value;
};
Run Code Online (Sandbox Code Playgroud)
现在,我想使用迭代器来更新它,使用以下函数:
void updateVariable(vector<Variable>& vars,Variable& newVar){
vector<Variable>::iterator it = find(vars.begin(), vars.end(), newVar);
if(it == vars.end()){
vars.push_back(newVar);
}
else{
*it = newVar;
}
}
Run Code Online (Sandbox Code Playgroud)
只是为了确定,我得到的错误是调用find()的行.任何想法为什么我收到错误?这是错误:
/usr/include/c++/4.6/bits/stl_algo.h:162:4: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Variable*, _Container = std::vector<Variable>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = Variable&]() == __val’
Run Code Online (Sandbox Code Playgroud)
更新:
谢谢大家的快速帮助,以及明确的答案!
我正在从C ++迁移到Java,并且在理解数组如何在Java中如何在其创建方法之外持久存在一个问题。请看下面的简单代码:
public static int[] arrayMethod(){
int[] tempArray = {1, 2, 3, 4};
return tempArray;
}
public static void main(String[] args){
int arr[] = arrayMethod();
for(int i : arr){
System.out.println(i);
}
}
Run Code Online (Sandbox Code Playgroud)
在C ++中,除非使用new操作符动态分配数组,否则在调用后该数组将不存在,因为它是在方法中本地创建的。据我了解,Java总是按值传递,而数组是引用类型,因此我的c ++逻辑会告诉我,我正在返回对本地创建的数组的引用。我想念什么?
我正在尝试这个指针技巧,我无法弄清楚如何修复它,我在64位的ubuntu 12.04上运行g ++ 4.6.看看下面的代码:
int arr[5];
arr[3] = 50;
((short*) arr)[6] = 2;
cout << arr[3] << endl;
Run Code Online (Sandbox Code Playgroud)
逻辑是:因为short是2个字节,int是4个字节,我想改变前2个字节arr[3],同时保持后2个字节的值为50.所以我只是搞乱位模式.不幸的是,sizeof(int*)和sizeof(short*)都是8个字节.是否存在返回大小为2字节的指针的类型转换?
更新:
我意识到这个问题编写得很糟糕,所以我会解决这个问题:cout << arr[3] << endl;我得到的输出是2.我想得的输出既不是2也不是50,而是大数,表示左边的部分int位模式的更改已经更改,而存储在arr [3]中的int的右侧部分(第二个2位)仍未更改.
c++ ×4
android ×2
android-ndk ×2
iterator ×2
stl ×2
boost ×1
c ×1
containers ×1
dereference ×1
ifstream ×1
java ×1
makefile ×1
pointers ×1
vector ×1