CentOS 6下Android SDK碰到提示”libc.so.6: version `GLIBC_2.14′ not found”的解决方法
在CentOS 6的机器上安装了Android的开发环境,碰到如下一些问题和解决方法
1. Android Studio 添加Android SDK时,提示缺少JDK 1.5、JDK 1.6 或 JDK 1.7, 但是机器上已经安装好JDK 1.6, JDK 1.7,还是提示同样的问题
解决方法,软件的提示信息Bug,其实是缺少 JDK 1.8(这个提示Bug应该会在后续版本被修订), 下载安装JDK 1.8,添加JDK 1.8后,再添加Android SDK,一切正常。
2. 新建一个简单Android项目,编译,提示”libc.so.6: version `GLIBC_2.14′ not found” 的错误信息
下载使用的是Android SDK Ver 25.2.5 Platform Tools Ver 25.0.3 Build Tools Ver 25.0.2
google搜索,确认是libc库的版本低的原因,CentOS 的libc版本文v2.14 要CentOS 7 才有支持 GLiBC_2.14,
解决方法要么重装系统使用CentOS 7, 要么逐个试验降低SDK版本,直到可以不要GLIBC_2.14的可用SDK版本。
既不想重装系统到CentOS7, 也不想逐个往下试验低版本SDK,
搜索网络后找到一个解决方法,也就是在其他目录编译安装一个并行的glibc 2.14版本,然后使用LD_LIBRARY_PATH临时指定到这个新安装的libc目录
-
wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
-
tar zxvf glibc-2.14.tar.gz
-
cd glibc-2.14
-
mkdir build
-
cd build
-
../configure –prefix=/opt/glibc-2.14
-
make -j4
-
sudo make install
-
export LD_LIBRARY_PATH=/opt/glibc-2.14/lib
在同一个终端下执行原本会出现 libc.so.6: version `GLIBC_2.14′ not found 提示的 aapt 命令,结果正常运行
至此,以为大功告成了,同一终端下,执行打开IDE的命令,结果没有界面出现
继续尝试解决方案,
将原本aapt改名aapt_, 新建一个同名的aapt,写入如下bash脚本
-
#!/bin/sh
-
export LD_LIBRARY_PATH=/opt/glibc-2.14/lib && "$0"_ $@
添加执行权限,在命令行下试了一下可以正常执行,将其他几个命令做同样处理
新建一个终端窗口,打开IDE,正常,新建一个Android项目,编译正常,
到此,大功告成,在没有更换操作系统和降低Android SDK版本的情况可以进行Android开发了
—-华丽分割线—–
“libc.so.6: version `GLIBC_2.14′ not found” 提示产生的原因:
使用了高版本的libc库编译,
-
objdump -T aapt |grep GLIBC_2.14
可以看到只有一个 memcpy 函数使用到了 GLIBC_2.14,
查看了一个CentOS目录下的应用,可以看到memcpy使用的是 GLIBC_2.2.5
如果自己拥有源码,可以添加如下一行代码,指定memcpy使用 GLIBC_2.2.5,使高版本编译出来的程序可以不做任何处理运行在低版本libc的系统上
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
Popularity: 9% [?]
Random Posts
使用WIFI调试Android程序
在连接usb线的情况下,先运行,端口可以自己指定换其他端口
adb tcpip 4455
查看手机的IP地址,然后
adb connect 手机IP:4455 adb shell
断开手机usb连接线,使用
adb devices
可以看到名为 手机IP:4455的设备
连接这个设备和以前一样调试操作
调试完成后,使用
adb usb
切换回使用usb数据线调试。
Popularity: 8% [?]
Random Posts
Android中ListView控件的使用
ListView要正常显示需要三个元素
1. 用来显示数据的 ListView 控件
2. 用来显示的数据 data
3. 用来将数据和 ListView 绑定的 ListAdapter
常见ListView风格
Android.R.layout.simple_list_item_1:每一项只有一个TextView
Android.R.layout.simple_list_item_2:每一项有两个TextView,id分别为text1和text2
Android.R.layout.simpte.list_item_single_choice,每一项有一个TextView,但是这一项可以被选中。
常见的ListAdapter子类
1. ArrayAdapter
使用一个数组来存储数据,实际显示数组项中toString()方法获得字符串。
-
// 构造一个listview对象
-
String[] data = {"item1","item2","item3"};
-
// 构造一个数组对象,也就是数据
-
listview.setAdapter(new ArrayAdapter(this,android.R.layout.simple_list_item_1, data));
-
//构造一个array适配器,然后listview对象通过setAdapter方法调用适配器来和自己绑定数据
-
setContentView(listview);
2. SimpleAdapter 派生的 SimpleCursorAdapter 和Sqlite数据绑定
一般用在 Android.R.layout.simple_list_item_2 一行数据有两行数据项的列表
SimpleAdapter需要传入一个数组列表和两个数组,其中数组列表用来存放实际数据,其中每一项为一个map,使用key=value方式存放数据。 两个数组一个为待显示的key名称,另外一个为显示数据的控件id
-
List<map>> data = new ArrayList</map><map>>();
-
Map item;
-
-
item = new HashMap();
-
item.put("name","张三");
-
item.put("sex","男");
-
data.add(item);
-
-
item = new HashMap();
-
item.put(“name”,”李四”);
-
item.put(“sex”,”女”);
-
-
data.add(item);
-
-
//构造listview对象
-
ListView listview= new ListView(this);
-
-
/*构造一个适配器。
-
* 1,第三个参数是说明用的是系统默认的布局data,android.R.layout.simple_list_item_2
-
* 2,第四和第五个参数一起理解:
-
* 把我们添加数据时姓名那一列对应到android.R.id.text1这个TextView中,把性别对应到android.R.id.text2这个TextView中。
-
*/
-
SimpleAdapter adapter = new SimpleAdapter(this,
-
data,
-
android.R.layout.simple_list_item_2,
-
new String[]{"name","sex"},
-
new int[]{android.id.text1,android.R.id.text2});
-
-
// 设置显示
-
listview.setAdapter(adapter);
-
setContentView(listview);
-
</map>
Popularity: unranked [?]
Related
Android动态挂载事件处理
好处,
1. 对代码块清晰方便阅读
2. 可以动态修改按钮的处理行为
如下列举了一下事件处理动态挂载处理方式
对Click事件做处理
-
public void onClick(View v) {
-
// doBtn Cmd
-
}
-
};
-
-
btn.setOnClickListener(btnHandler);
对ListView的ItemClick事件做处理
-
@Override
-
public void onItemClick(AdapterView av, View v, int selID, long resid ) {
-
switch (selID) {
-
case 0: // cmd0
-
doCmd0();
-
break;
-
case 5: // about
-
showAbout();
-
break;
-
}
-
}
-
};
-
-
listView.setOnItemClickListener(listClickHandler);
Popularity: unranked [?]
Related
在Android使用AlterDialog输入简单数据
使用AlterDialog实现其他语言类似InputBox之类的简单数据输入。
-
-
alter.setIcon(getResources().getDrawable(R.drawable.icon));
-
alert.setTitle("输入框标题");
-
alert.setMessage("输入提示信息");
-
-
// 添加一个EditText输入数据
-
final EditText input = new EditText(this);
-
alert.setView(input);
-
-
alert.setPositiveButton("确定", new DialogInterface.OnClickListener() {
-
public void onClick(DialogInterface dialog, int whichButton) {
-
String value = input.getText();
-
// 对输入的数据做处理
-
}
-
});
-
-
alert.setNegativeButton("取消", new DialogInterface.OnClickListener() {
-
public void onClick(DialogInterface dialog, int whichButton) {
-
// 做取消输入的事情
-
}
-
});
-
//显示对话框等待输入数据
-
alert.show();
Popularity: unranked [?]
Related
在 Android 程序中禁止屏幕旋转和避免重启Activity
禁止屏幕随手机旋转变化
有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变化:
在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入 android:screenOrientation=”landscape” 属性。
避免在转屏时重启Activity
android中每次屏幕方向切换时都会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次 Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
要避免在转屏时重启Activity,可以通过在AndroidManifest.xml文件中重新定义方向(给每个Activity加上 android:configChanges=”keyboardHidden|orientation”属性)。
在需要控制屏幕显示方向的Activity中重写 onConfigurationChanged(Configuration newConfig)方法,这样在转屏时就不会重启Activity了。
-
//横向
-
setContentView(R.layout.file_list_landscape);
-
}else{
-
//竖向
-
setContentView(R.layout.file_list);
-
}
在模拟器中可以按 CTL+F11 模拟做屏幕旋转。
Popularity: unranked [?]
Related
Android NDK调试碰到signal 11 (SIGSEGV), fault addr deadbaad
使用NDK开发的so文件在运行时崩溃,日志中提示
signal 11 (SIGSEGV), fault addr deadbaad
然后后面列出了一些寄存器值和pc代码行,stack等信息,根据pc代码行配合 arm-eabi-addr2line可以发掘出错位置所对应的函数名。用法如下;
arm-eabi-addr2line -f -e libmyjni.so 0×00024039 (输出日志中最上面的pc值,可以回溯最终函数调用顺序)
程序中需要有符号信息,不能使用下面的语句将调试符号剔除
build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/arm-eabi-strip –strip-debug apps/NDKTest/project/libs/armeabi/libmyjni.so
Popularity: unranked [?]
Related
在Android NDK 中使用STLport(译)
Android NDK是Native C/C++开发,不过下载来看了一下缺少常见的STL库,使用起来诸多不便,于是网上google了一把,发现有人做了这样的事情,特别转过来
——————————–
原文: Android NDK – getting STLPort up and running
作者: Pete Cole
——————————-
如果你想在Android NDK使用STLPort, 你必须要做点处理,即便你是在windows上使用cygwin.
首先, 从http://umbel.mooo.com/ 获取一份修改版的 STLPort(by John Ripley (great job, John!)). 如果你是一个 cygwin 用户, 你首先要安装一个git包(译注:可以直接下载snapshot,这样就不要安装git了).
然后将文件拷贝到你的工作目录下. 在我的机器上, 我将文件拷贝到了c:\android-ndk-1.5_r1 目录下, 并将 两个hello-stl 文件夹移动到其他和NDK有关的目录下:
C:\android-ndk-1.5_r1\apps\hello-stl C:\android-ndk-1.5_r1\sources\samples\hello-stl
然后在Build STLPort前必须修改一些文件…
setup.sh
将最前面的一些行修改正如下样子:
-
#!/bin/bash
-
if uname | grep -qi linux; then
-
export NDK_HOST=linux-x86
-
elif uname | grep -qi CYGWIN; then
-
export NDK_HOST=windows
-
else
-
export NDK_HOST=darwin-x86
-
fi
将倒数第三行修改成如下样子:
-
ln -sf "$NDK_DIR/build/prebuilt/${NDK_HOST}/arm-eabi-4.2.1/bin/arm-eabi-$tool" arm-linux-$tool
stlport/build/lib/android.mak
将TOOLCHAIN_PREFIX这一行修改成
-
TOOLCHAIN_PREFIX := $(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.2.1/bin/arm-eabi-
译注: 我下载来的Wrapper包已经是这个样子了,不用修改
sources/samples/hello-stl/Android.mk
将STLPORT_BASE这一行修改成如下样子:
-
STLPORT_BASE := /cygdrive/c/android-ndk-1.5_r1/stlport
译注:我没有修改这边,执行了一个export NDK_WRAPPERS_BASE=basepath的操作
将:
-
LOCAL_LDLIBS += -L$(STLPORT_BASE)/build/lib/obj/gcc/so \
-
-lstlport
修改成
-
LOCAL_STATIC_LIBRARIES := libstlport.5.1
Building STLPort
现在文件已经被合并了,你可以立即build STLPort了!
执行如下cygwin shell脚本… 它将build STLPort的静态链接库! 对此你只需要做一次.
-
export NDK_DIR=/cygdrive/c/android-ndk-1.5-r1
-
cd $NDK_DIR
-
./env.sh
-
./setup.sh
现在,像下面这样讲文件拷贝到你的工程中:
-
cp -p \
-
/cygdrive/c/android-ndk-1.5_r1\stlport\build\lib\obj\gcc\ar\libstlport.5.1.a \
-
/cygdrive/c/android-ndk-1.5_r1\out\apps\hello-stl\android-1.5-arm
Building your project’s shared library.
现在你可以返回cygwin的shell窗口,然后执行如下命令:
-
cd /cygdrive/c/android-ndk-1.5_r1
-
make APP=hello-stl
将编译你的共享库文件:
C:\android-ndk-1.5_r1\apps\hello-stl\project\libs\armeabi\libhello-stl.so
注: 这会将STLPort静态链接到你的库中.
Building the hello-stl project
在Eclipse中,使用New Project Wizard为每一个例子创建一新的Android project, 使用”Import from Existing Source” 选项从c:\android-ndk-1.5_r1\apps\hello-stl\project 导入源文件
现在你可以编译和运行你的项目了. 将显示从共享库中返回来的std::string字符串 …!
Popularity: 6% [?]