python获取动态网站上面的动态加载的数据(初级)
用ildasm/ilasm修改IL代码
[LeetCode] Read N Characters Given Read4 用Read4来读取N个字符
pycharm 如何设置方法调用字体颜色
mysql 触发器,insert,auto字段竟然一样….
LCIS 最长上升公共子序列问题
Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库
Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库

目的:   实现使用C++编写代码供Android工程调用。C++代码中可以使用STL库,也可以使用常用的由源码编译生成的库,如PBC。因为PBC是基于GMP库的,所以这里只记录了GMP和PBC库的编译安装方法,其它库的方法类似。 特点:   不使用集成的ndk-build功能,不需要在jni目录下写c文件和mk文件,而是从NDK中提取出交叉编译toolchain,这样可以在CodeBlocks等环境中建立独立工程进行C++代码的开发,然后编译生成动态库交给Android工程来加载。 准备工作:  一个搭建好的Android开发环境(SDK),以及:  android-ndk-r9d-linux-x86_64.tar.bz2  gmp-6.0.0a.tar.bz2  pbc-0.5.14.tar.gz  这些都可以去各自的官网下载到。 一、搭建Android交叉编译环境   解压ndk开发包,并提取其中的toolchain到指定目录: $ cd android-ndk-r9d/ $ build/tools/make-standalone-toolchain.sh –toolchain=arm-linux-androideabi-4.8 –platform=android-19 –system=linux-x86_64 –install-dir=$HOME/android-19-arm   参数说明:这里的toolchain参数指定的目标是基于ARM的Android设备,也可以根据需要改成基于x86或MIPS的Android设备,具体的参数名可以参见android-ndk-r9d/toolchains目录。参数platform设置为android-19,指生成的工具链是针对Android 4.4版本的,具体对应关系可以查看android-ndk-r9d/docs/STABLE-APIS.html文件。参数system指的是本机系统,即运行toolchain的环境。这里将提取出来的toolchain安装到了用户主目录下的android-19-arm文件夹,以后的工作都是在这个文件夹下进行,不再需要android-ndk-r9d目录了。   为toolchain添加环境变量,在文件/etc/profile的最后加上: # android toolchain export TOOLCHAIN_HOME=$HOME/android-19-arm export PATH=$TOOLCHAIN_HOME/bin:$PATH   然后最好注销一次,使环境变量生效(也可以用source /etc/profile,但好像只对本终端有效「注:elementary OS Luna」)   测试: $ arm-linux-androideabi-gcc –version 二、配置Codeblocks开发环境   打开Codeblocks,选择Settings–Compiler,选择GNU GCC Compiler,然后点Copy,这时会让填写新的编译器的名字,填写GCC Toolchain For Android。在Toolchain executables页中,编译器的安装目录选择在第一步中创建的目录(也就是$TOOLCHAIN_HOME所指向的目录,这里不能使用环境变量),然后将下面的gcc、g++、ar分别改成arm-linux-androideabi-gcc、arm-linux-androideabi-g++和arm-linux-androideabi-ar,Debugger和Make不用改动,保存。   现在已经配置好了codeblocks环境,创建工程时,需要选择刚才创建的编译器,编译出来的程序才能在Android中运行。   可以新建一个名为testToolchain的控制台程序来测试一下,选择GCC Toolchain For Android编译器,然后编译出来的可执行程序是Android系统上的原生C++程序,在x86平台上是不能运行的,可以传到手机上之后,使用adb shell或在手机上安装诸如BTEP终端来运行。在Ubuntu上用file命令也可以查看文件的信息: $ file testToolchain testToolchain: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped   可以看出,的确是生成了arm平台的目标程序。 三、使用Codeblocks来开发动态库并交给Android工程调用 Android工程:  在Android工程中(假设工程名为TestAndroidApp),在需要调用C函数的地方声明native函数,例如在MainActivity.java中声明: public native String function_in_c_code();   运行一下后生成对应的class文件,然后打开终端,切换到工程文件夹下的bin/classes目录,创建头文件: $ javah com.example.testandroidapp.MainActivity   然后会在当前目录下生成com_example_testapp_MainActivity.h头文件,里面有经过java改造的C++函数的声明方法。 Codeblocks中:  创建一个动态库工程(Shared library),假设工程名为cMainProc,编译器选择GCC Toolchain For Android,完成。这时应该先把刚才在Android中声明的接口函数实现,然后在接口函数中就可以随意调用自己写的其它函数或者库了。在CPP文件中,首先包含刚才使用javah命令生成的头文件。可以用相对路径引用它,也可以把头文件复制到当前工程中。然后按照头文件中的声明来创建接口函数,在刚才的例子中,应该创建这样一个函数: jstring JNICALL Java_com_example_testandroidapp_MainActivity_function_1in_1c_1code (JNIEnv *env, jobject) { // todo: your code here. return env->NewStringUTF(“Hello world.”); } […]

Ajax与CustomErrors的尴尬
Ajax与CustomErrors的尴尬

在ASP.NET程序中,为了给用户显示友好的错误信息,通常在web.config中进行如下的设置: <customErrors mode="RemoteOnly" defaultRedirect="/error/error.htm"></customErrors> 但如果是一个ajax请求在服务端发生了错误,将遭遇一个尴尬。我们就遭遇过这样的尴尬,见下图: 上图中显示“抱歉!系统发生了错误!”的地方是ajax加载的内容,ajax部分的js代码如下: $.ajax({ success: function (data) { if (data) { resultElement.html(data); } }}); 从上面的代码可以知道,虽然ajax请求出错,但依然在success回调函数中处理了,导致将定制错误信息作为正常返回内容显示出来,从而造成前图中的尴尬。 刚面对这个问题时,我们想到的解决方法是根据statusCode进行判断,如果是500,就知道是发生了错误,然后进行特定的错误处理。我们写了这样的测试代码: $.ajax({ statusCode: { 500: function () { console.log('error!'); } }, success: function (data) { if (data) { resultElement.html(' ' + data); } }}); 结果发现,并没有执行对应于500 statusCode的回调函数。 在浏览器中查看了一下,原来服务器端返回的是302状态码。也就是说,在默认情况下,ASP.NET用重定向的方式向浏览器返回定制错误信息。在web.config>CustomErrors中,有个专门的属性redirectMode,其默认值就是ResponseRedirect。redirectMode还有个值是ResponseRewrite,能不能解决我们的问题呢?我们改一下web.config试一试,修改如下: <customErrors mode="RemoteOnly" defaultRedirect="/error/error.htm" redirectMode="ResponseRewrite"></customErrors> 结果发现,的确是返回500状态码了,但定制错误错误没了,返回的是Runtime Error。 当设置redirectMode=”ResponseRewrite”,发生错误时,ASP.NET实际会执行Server.Transfer()返回定制错误信息页面,而Server.Transfer()与ASP.NET MVC路由存在兼容问题,详见CustomErrors does not […]