批量转换文件编码

适用于Linux及 Mac OS 系统,Windows就抱歉了,你们自己想办法吧。

find . -name *.java -exec sh -c "iconv -f GBK -t UTF8 {} > /tmp/iconv.tmp" \; -exec mv /tmp/iconv.tmp '{}' \;

以上命令将所有 .java 文件由GBK编码转换为UTF8编码。

注意,网上有很多文章将 iconv 命令写成这样:

find . -name *.java -exec sh -c "iconv -f GBK -t UTF8 {} > {}" \;

再说一句,上面这种写法是错误的,以上写法相当于 iconv 输出到源文件,但不知是BUG还是别的原因,你只能得到0字节的空文件,所以必须使用第一条命令,先生成到一个临时文件,然后再移动回来。

JAVA+jni 包名或方法名中含有下划线(_)的解决方法

jni或NDK定义C函数是用下划线(_)作为命名分隔。但如果JAVA包名或方法名里包含了_ 那么就会发生找不到函数的错误,对此网上的各教程都说不要使用 _,对于新项目,这种情况当然很容易避免,但若对一原有项目开发jni接口就麻烦了,特别是在 Android 平台下,包名决定着应用的唯一识别,轻易改不的。

经过不懈的努力,我终于找到了解决方法,简单来说就是在 _ 后加1,如:

// JAVA
package net.zhigang.ndk_test;

public class NdkTest
{
    static {
        System.loadLibrary(ndktest);
    }
    public native void sayHello();
}

//C
#include <jni.h>

jstring Java_net_zhigang_ndk_1test(JNIEnv* env, jobject thiz)
{
    return env->NewStringUTF("Hello from jni");
}

注意上面C语言部分的 ndk_1test。

移植libcurl到Android NDK

测试通过环境:
操作系统:Mac OS
NDK:NDK r8e
libcurl:7.31.0

下载NDK环境: http://developer.android.com/tools/sdk/ndk/index.html ,安装环境不废话了。

在NDK安装目录执行

./build/tools/make-standalone-toolchain.sh

导出编译工具,一般生成压缩如 /tmp/ndk-zhigang/arm-linux-androideabi-4.6.tar.bz2。

解压:

cd /opt/
sudo tar xf /tmp/ndk-zhigang/arm-linux-androideabi-4.6.tar.bz2

下载curl源代码:http://curl.haxx.se/download.html

设置编译环境:

export LDFLAGS="\
-L/usr/local/Cellar/android-ndk/r8e/platforms/android-14/arch-arm/usr/lib"

export CPPFLAGS="\
-I/usr/local/Cellar/android-ndk/r8e/platforms/android-14/arch-arm/usr/include"

将以上路径修改为自己的NDK安装目录。

进入curl目录:

./configure --host=arm-linux-androideabi \
--disable-ftp \
--disable-gopher \
--disable-file \
--disable-imap \
--disable-ldap \
--disable-ldaps \
--disable-pop3 \
--disable-proxy \
--disable-rtsp \
--disable-smtp \
--disable-telnet \
--disable-tftp \
--without-gnutls \
--without-libidn \
--without-librtmp \
--without-ssl \
--disable-dict

mark

生成的静态库文件位于:lib/.libs/libcurl.a 动态库:libcurl.so.5.3.0

一般我们使用静态库文件。

复制 libcurl.a 到项目 jni/ 目录,修改 Android.mk 文件:

# A simple test for the minimal standard C++ library
#

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := curl
LOCAL_SRC_FILES := libcurl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_CFLAGS = -Wno-psabi
LOCAL_MODULE := curltest
LOCAL_SRC_FILES := curltest.c
LOCAL_STATIC_LIBRARIES := libcurl
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_LDLIBS    += -lz

参考:http://stackoverflow.com/questions/11330180/porting-libcurl-on-android-with-ssl-support