当前位置:  编程技术>移动开发
本页文章导读:
    ▪JNI转发换        JNI中转换jstring str2jstring(JNIEnv* env,const char* pat) { //定义java String类 strClass jclass strClass = (env)->FindClass("Ljava/lang/String;"); //获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一.........
    ▪ xcode 4.6 破译及真机调试        xcode 4.6 破解及真机调试从安卓到IOS,从  eclipse 到xcode跨度还是比较大的。在研究的过程中发现,许多时候不仅仅是C,C++,JAVA和OBJECT-C的区别,相对于编程语言来.........
    ▪ 数据结构(十)之查找       数据结构(10)之查找1 前言      这节我们简单的介绍一下常见的查找算法。 2 详述 2.1 查找概论 查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合。 关键字(Key)是数据.........

[1]JNI转发换
    来源: 互联网  发布时间: 2014-02-18
JNI中转换
jstring str2jstring(JNIEnv* env,const char* pat)
{
    //定义java String类 strClass
    jclass strClass = (env)->FindClass("Ljava/lang/String;");
    //获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
    jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
    //建立byte数组
    jbyteArray bytes = (env)->NewByteArray(strlen(pat));
    //将char* 转换为byte数组
    (env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
    // 设置String, 保存语言类型,用于byte数组转换至String时的参数
    jstring encoding = (env)->NewStringUTF("GB2312"); 
    //将byte数组转换为java String,并输出
    return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}
 
 
std::string jstring2str(JNIEnv* env, jstring jstr)
{   
    char*   rtn   =   NULL;   
    jclass   clsstring   =   env->FindClass("java/lang/String");   
    jstring   strencode   =   env->NewStringUTF("GB2312");   
    jmethodID   mid   =   env->GetMethodID(clsstring,   "getBytes",   "(Ljava/lang/String;)[B");   
    jbyteArray   barr=   (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);   
    jsize   alen   =   env->GetArrayLength(barr);   
    jbyte*   ba   =   env->GetByteArrayElements(barr,JNI_FALSE);   
    if(alen   >   0)   
    {   
        rtn   =   (char*)malloc(alen+1);         
        memcpy(rtn,ba,alen);   
        rtn[alen]=0;   
    }   
    env->ReleaseByteArrayElements(barr,ba,0);   
    std::string stemp(rtn);
    free(rtn);
    return   stemp;   
} 




// convert jbyteArray to std::string

jsize   alen   =   env->GetArrayLength(rawArray);
	    jbyte*   ba   =   env->GetByteArrayElements(rawArray,JNI_FALSE);
	    if(alen   >   0)
	    {
	        rtn   =   (char*)malloc(alen+1);
	        memcpy(rtn,ba,alen);
	        rtn[alen]=0;
	    }
	    env->ReleaseByteArrayElements(barr,ba,0);
	    std::string theStr(rtn);
	    free(rtn);



// convert jbyteArray to std::string

std:string native_strAddr = env->GetStringUTFChars(strAddr, NULL);

需要include<cstring>和<string>.



    
[2] xcode 4.6 破译及真机调试
    来源: 互联网  发布时间: 2014-02-18
xcode 4.6 破解及真机调试

从安卓到IOS,从  eclipse 到xcode跨度还是比较大的。在研究的过程中发现,许多时候不仅仅是C,C++,JAVA和OBJECT-C的区别,相对于编程语言来说,操作习惯和开发工具带来的困惑要更大。常规的回到桌面,文件管理,复制,粘贴,切换输入法,已经让人有些不舒服了。而  xcode的使用也比较痛苦,既不同于ECLIPSE,也不同于NET,也没有找到可以使用终端开发的方法。由于版本的不同,再也没有比在一堆菜单和设置选 项中翻来翻去更痛苦的事了。不过后来找到了不少和LINUX相类似的终端命令 ,才使 我终于在开发中松了一口气,开发的效率才有了一些保证。不同操作系统平台原始级的字符操作界面是如此的相似,这也许可以解释为什么在强力IDE时代,为什么还有人喜欢抱着巴掌大的黑窗口不放的原因吧。各种操作平台的提供了差不多一致的命令和相似的操作,熟练掌握一套,遇到其他系统也可以差不多八九不离十的使用了,甚至不需要去阅读MAC使用手册。

xcode 4.6是比较新的xcode  版本,与以后的版本变化比较大,网上很多资料不太准确。

第一步:制作证书

1)打开   Finder->应用程序->实用工具 ->  钥匙串访问 

2)单击:"钥匙串访问"选择  "证书" 再选择"创建证书"过程如下图:

注意:证书名称必须填写为 iPhone Developer,在4.6中,几乎一步就完成了,不需要做什么特殊设置,默认就一步通过。其他版本不是这样,需要设置邮箱,密钥长度,用途等。

第二步:修改XCode配置文件

1)修改SDKsettings.plist文件

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk

打开该目录下的SDKSettings.plist文件,把CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED的值改成NO

注:A。这是4.6的配置文件路径,其他版本似乎在别的路径,如:/Developer/Platforms/iPhoneOS.platform,B。最好先把SDKSettings.plist备份,以保证在修改出错时能够还原。即使 你不会犯错,最好还是备份下,以后如果拿到了开发者帐号,成了正规军后,这个仍然可以用于还原。可以使用CP命令做一副本。C。如遇到文件无法解锁没有权限不能修改,可以在终端使用sudo -i切换到ROOT,然后使用chmod修改该文件属性为A+X 

2)修改Info.plist文件

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/

用XCode打开该目录下的Info.plist文件,右击--Add Row,增加两项:

PROVISIONING_PROFILE_ALLOWED 值为 NO

PROVISIONING_PROFILE_REQUIRED 值为 NO

3)将上面Info.plist文件中的 "XCiPhoneOSCodeSignContext" 替换成 "XCCodeSignContext"(共3处)分别在DefaultProperties分支下、RuntimeRequirements分支下和OverrideProperties分支下。

注:A。Info.plist在修改之前,最好做一个备份,以用于还原。B。在4.6中是一个二进制文件,必需使用XCODE 编辑,如果修改不成功,同样先使用ROOT权限chmod修改这个文件属性为A+X

第三步:设置gen_entitlements.py脚本权限


注:如果你的电脑联网了,那么执行1)的命令后会在相应的目录自动创建iphoneentitlements文件夹及其下的gen_entitlements.py文件,如执行后没有生成指定文件,请重复执行下面的命令或者换第二种方法,两种生成脚本文件的方法任选一种。

 1)在终端执行如下命令:

mkdir /Applications/Xcode.app/Contents/Developer/iphoneentitlements
cd /Applications/Xcode.app/Contents/Developer/iphoneentitlements
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
sudo chmod 777 gen_entitlements.py
这几行指领就是创建一个gen_entitlements.py的文件,内容从网络获取。

2)上面的命令执行成功之后,会在/Applications/Xcode.app/Contents/Developer/目录下生成一个iphoneentitlements文件夹和其下的gen_entitlements.py文件,如果你的电脑没有联网或者不能自动生成相关目录文件,那么需要手动在相应的目录创建指定的文件,随后需要给gen_entitlements.py设置权限。

gen_entitlements.py脚本文件的内容如下:

#!/usr/bin/env python
import sys
import struct
if len(sys.argv) != 3:
	print "Usage: %s appname dest_file.xcent" % sys.argv[0]
	sys.exit(-1)
APPNAME = sys.argv[1]
DEST = sys.argv[2]
if not DEST.endswith('.xml') and not DEST.endswith('.xcent'):
	print "Dest must be .xml (for ldid) or .xcent (for codesign)"
	sys.exit(-1)
entitlements = """
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>%s</string>
    <key>get-task-allow</key>
    <true/>
</dict>
</plist>
""" % APPNAME

f = open(DEST,'w')
if DEST.endswith('.xcent'):
	f.write("\xfa\xde\x71\x71")
	f.write(struct.pack('>L', len(entitlements) + 8))
f.write(entitlements)
f.close()

第四步:修改项目属性

1)点击项目图标,找到"Build Settings"选项下的"Code Sign Identity",将其值全部改为"Don't Code Sign"

这是不使用系统签名,后面使用我们自己第一步创建的答名

2)切换到Build Phases选项,点击右下角的Add Build Phase,然后单击Add Run Script,然后在Run Script中输入以下脚本:

export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ] || [ "${PLATFORM_NAME}" == "ipados" ]; then
/Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi

第五步:连接设备(iphone/ipad)

点XCode右上角的Organizer图标,然后选中你的设备,在右边窗口中点击“Use for Development” 即可,此时你的设备名称旁边应该显示黄色的小灯,重新拔插数据线,Organizer中会出现一个进度条,等这个进度条跑完,小灯就会变成绿色,开发模式已经启用。


第六步:打包应用程序,生成ipa文件

在xcode上选择product菜单,选择Build For ---> Build for Achiving,就能成一个APP文件了。

然后把这个APP文件拖到itunes,就可以生成一个ipa文件,IPA可以分发给你的朋友和客户或者认识的人,让他们帮你测试程序。


参考:

http://blog.csdn.net/abcddtt/article/details/9074099

http://www.cnblogs.com/flyingzl/articles/2207717.html

http://kqwd.blog.163.com/blog/static/4122344820117191351263/


    
[3] 数据结构(十)之查找
    来源: 互联网  发布时间: 2014-02-18
数据结构(10)之查找
1 前言

     这节我们简单的介绍一下常见的查找算法。

2 详述 2.1 查找概论

查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合。

关键字(Key)是数据元素中某个数据项的值,又称为键值。

可以识别多个数据元素(或记录)的关键字,我们称为次关键字(Secondary Key)。

查找(Searching)就是根据给定的某个值,在查找中确定一个其关键字等于给定的数据元素(或记录)。

查找按照操作方式来分有两大种:静态查找表和动态查找表。

静态查找表(Static Search Table):只做查找操作的查找表。

(1)查询某个“特定的”数据元素是否在查找表中。

(2)检索某个“特定的”数据元素和各种属性。

动态查找表(Dynamic Search Table):在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。

(1)查找时插入数据元素。

(2)查找时删除数据元素。

2.2 顺序查找表

顺序查找(Sequential Search)又叫线性查找,是最基本的查找技术,它的查找过程是:从表第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查找的记录;如果知道最后一个(或第一个)记录,其关键字和给定值比较都不相等,则表中没有所查的记录,查找不成功。

2.2.1 顺序查找算法

代码实现:

/*顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字*/
int Sequntial_Search(int *a,int n,int key)
{
    int i;
    for(i =1;i<=n;i++)
    {
        if(a[i]==key)
            return i;
    }
    return 0;
}


2.2.2 顺序查找优化

/*有哨兵顺序查找*/
int Sequential_Search2(int *a,int n,int key)
{
    int i;
    a[0]==key;  /*设置a[0]为关键字值,我们称之为“哨兵”*/
    i=n;        /*循环从数组尾部开始*/
    while(a[i]!=key)       
    {
        i--;
    }
    return i;       /*返回0则说明查找失败*/
}


时间复杂度为 O(n)。

2.3 有序表查找 2.3.1 折半查找

折半查找(Binary Search)技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常是从小到大有序),线性表必须采用顺序存储。折半思想:有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,知道查找成功,或所有查找区域无记录,查找失败为止。

算法实现:

/*折半查找*/
int Binary_Search(int *a,int n,int key)
{
    int low,high,mid;
    low = 1;              /*定义最低下标为记录首位*/
    high = n;        /*定义最高下标为记录末位*/
    while(low<=high)
    {
        mid = (low+high)/2;       /*折半*/
        if(key<a[mid])           /*若查找值比中值小*/
            high = mid -1;       /*最高下标调整到中位下标小一位*/
        else if(key>a[mid])     /*若查找值比中值大*/
            low = mid+1;       /*最低下标调整到中位下标大一位*/
        else
            return mid;      /*若相等则说明mid即为查找到的位置*/
    }
}

时间复杂度O(logn)。

2.3.2 插值查找

插值查找(Interpolation Search)是根据要查找的关键字key与查找表中最大最小记录的关键字比较厚的查找方法,其核心就在于插枝的计算公式(key-a[low])/(a[high]-a[low])。

mid = low +(high-low)*(key-a[low])/(a[high]-a[low])。


时间复杂度为O(logn),但是对于表长较大,而关键字分布又比较均匀的查找表来说,插枝算法的平均性能比折半查找要好很多。

2.4斐波那契查找

斐波那契数列:

程序运行:

/*斐波那契查找*/
int Fibonacci_Search(int *a,int n,int key)
{
    int low,high,mid,i,k;
    low = 1;      /*定义最低下标为记录首位*/
    high = n;     /*定义最高下标为记录末尾*/
    k = 0;
    while(n>F[k]-1)      /*计算n位于斐波那契数列的位置*/
        k++;
    for(i = n;i<F[k]-1;i++)        /*将不满数值补全*/
        a[i] = a[n];
    while(low<=high)
    {
        mid = low +F[k-1]-1;     /*计算当前分隔的下标*/
        if(key<a[mid])               /*若查找记录小于当前分隔记录*/
        {
            high = mid-1;           /*最高下标调整到分隔下标mid-1处*/ 
            k = k-1;                     /*斐波那契数列下标减一位*/
        }
        else if(key>a[mid])     /*若查找记录大于当前分隔记录*/
        {
            low = mid+1;        /*最低下标调整到分隔下标mid+1处*/
            k=k-2;                   /*斐波那契数列下标减两位*/
        }
        else
        {
            if(mid<=n)            /*若想等说明mid即为查找到得位置*/
                return mid;
            else
                return n;           /*若mid>n说明是补全数值,返回n*/
        }
    }
    return 0;
}


时间复杂度O(logn)。

2.5 线性索引查找

索引就是把一个关键字与它对应的记录相关联的过程。

所谓线性索引就是将索引项集合组织为线性结构,也称为索引表。

2.5.1 稠密索引

在线性索引中,将数据集中的每个记录对应一个索引项。

对于稠密索引这个索引表来说,索引项一定是按照关键码有序的排列。

2.5.2 分块索引

分块有序,是吧数据集的记录分成了若干块,并且:

·快内无序

·块间有序:第二块所有的记录的关键字均大于第一块中所有记录的关键字,第三块的所有记录的关键字均大于第二块的所有记录的关键字。

分块索引的索引项结构分为三个数据项:

·最大关键码,它存储每一块中的最大关键字

·存储了块中的记录个数

·用于指向首数据的指针,便于开始对这一块中记录进行遍历

时间复杂度高于顺序查找,低于折半查找。

2.5.3 倒序索引

索引结构:

·次关键码,例如上面的“英文单词”

·记录号表,例如上面的“文章编号”

其中记录号表存储具有系统次关键字的所有记录的记录号(可以是指向记录的指针或者是该记录的主关键字)。这样的索引方法就是倒序索引(inverted index)。

2.6 二叉树排序

二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。

·若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值;

·若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

·若它的左,右子树也分别为二叉排序树。

查找实现

/*递归查找二叉排序树T种是否存在key*/
/*指针f指向T的双亲,其初始调用值为NULL*/
/*若查找成功,则指针p指向该数据元素结点,并返回TRUE*/
/*否则指针p指向查找路径上访问的最后一个结点并返回FALSE*/
Status SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
    if(!T)
    {
        *p = f;
        return FALSE;
    }
    else if(key == T->data)
    {
        *p = T;
        return TRUE;
    }
    else if(key<T->data)
        return SearchBST(T->lchild,key,T,p);  /*在左子树继续查找*/
    else
        return SearchBST(T->child,key,T,p);   /*在右子树继续查找*/
}

3 结语

    以上是所有内容,希望对大家有所帮助。


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3