当前位置:  编程技术>移动开发
本页文章导读:
    ▪Google Play是怎么屏蔽添加了Checkout的应用在一些地区不能下载的        Google Play是如何屏蔽添加了Checkout的应用在一些地区不能下载的 因为google checkout 只支持一些地区使用,不幸的是中国大陆不在支持之列。所以加了checkout 的应用或游戏在google play的网页上.........
    ▪ 一直使用的一个异常,记得把array release!        一直使用的一个错误,记得把array release!!!!   NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; NSMutableArray *array = [dict objectForKey:@"key"]; if (array == nil) { .........
    ▪ 本土方法调用1       本地方法调用1 啊,好久没写blog了,更新还真是不适应。这个。。。话说,婚假回来,就一直没有感觉,虽然现在感觉也不是很好,但还是要hold住~今天开始要搞一搞jni了,不然一年也屡.........

[1]Google Play是怎么屏蔽添加了Checkout的应用在一些地区不能下载的
    来源: 互联网  发布时间: 2014-02-18
Google Play是如何屏蔽添加了Checkout的应用在一些地区不能下载的
因为google checkout 只支持一些地区使用,不幸的是中国大陆不在支持之列。
所以加了checkout 的应用或游戏在google play的网页上会提示与你的设备不兼容。

对于google play这个是如何来做的比较疑惑,做了下测试

1、仅仅在AnroidManifest.xml文件中添加了权限限制
<uses-permission android:name="com.android.vending.BILLING" />

发布了app后发现还是能够下载的。

猜测:检测apk包中是否有这个类?
com.android.vending.billing.IMarketBillingService
但是如果包加了混淆,这个如何检测呢?

对这个比较疑惑,上面的仅为个人猜测,请教达人们的意见。

    
[2] 一直使用的一个异常,记得把array release!
    来源: 互联网  发布时间: 2014-02-18
一直使用的一个错误,记得把array release!!!!

 

         NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
         
         NSMutableArray *array = [dict objectForKey:@"key"];
         if (array == nil) {
             array = [[NSMutableArray alloc] init];
             [dict setObject:array forKey:@"key"];
             [array release];	//千万记得Release
         }
         [array addObject:@"object"];

    
[3] 本土方法调用1
    来源: 互联网  发布时间: 2014-02-18
本地方法调用1
啊,好久没写blog了,更新还真是不适应。这个。。。话说,婚假回来,就一直没有感觉,虽然现在感觉也不是很好,但还是要hold住~
今天开始要搞一搞jni了,不然一年也屡不清原计划啊。
java的书从来都说的很好,100%纯java的是非常好的,但是,java性能真的还是不如c和c++。一般的辩解会是:网络io才是真正的瓶颈等等云云。ok,没错,但是(当然要有但是啦。一?这句话怎么这么熟?),java的速度确实不如c和c++,导致在很多时候,如用户响应上,确实有时会有不顺畅的感觉。当然,瑕不掩瑜,在很多时候,java还是非常强的,并且很难替代。
今天,先来一节入门篇,讲讲如何从java调到c函数的。
首先是native申明。
native声明一个方法后,就不用再写方法体了,因为实现是在下面进行。
来看看code:
class HelloNative{
    public static native void greeting();
}

注意,static不是必须的。
你实际可以使用这个类,但是在程序中使用它时,虚拟机就会告诉你它不知道如何找到greeting,它会报告一个UnsatisfiedLinkError异常。为了实现本地代码,需要编写一个响应的c函数,你必须要完全按照java规则来命名这个函数:
1)使用完整的java方法名,比如:HelloNativ.greeting。如果类输入某个包,那么前面添加报名,比如:com.horstmann.HelloNative.greeting。
2)用下划线替换掉所有的句号,并加上Java_前缀,例如,Java_HelloNative_greeting或者Java_com_horstmann_HelloNative_greeting。
3)如果类名含有非ASCII字母或数字,如:‘_’,‘$’或是大于‘\u007f’的Unicode字符,用_0xxxx来替代它们,xxxx是该字符的值的4个十六进制数。
(注意,如果有两个方法 greeting()和greeting(int i),那么必须在后缀附加两个下划线,后面加上已编码的参数类型:Java_HelloNative_greeting__和Java_HelloNative_greeting__I)
很麻烦吧?别紧张,这些东西,是能够自动生成的,先使用javac对java文件编译,然后使用javah,生成如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */

#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloNative
 * Method:    greeting
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

接下来我们只用在HelloNative.c的文件中实现这个声明了的方法就好了:
#include "HelloNative.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv* env, jclass cl){
    printf("hello native world!\n");
}

C++也是可以的:
extern "C"
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv* env, jclass cl){
    cout<<"hello native world!"<<endl;
}

ok,我们可以把这个.c文件在linux下编译了,命令:
gcc -fPIC -I jdk/include -I jdk/include/linux -shared -o libHelloNative.so HelloNative.c

好了,生成的so就可以使用了,当然,为了确保虚拟机第一时间把库load进去,我们要使用静态初始化代码块:
class HelloNativeTest{
    static{
        System.loadLibrary("HelloNative");
    }

    public static void main(String[] args){
        HelloNative.greeting();
    }
}

在linux在,必须把当前目录添加到库路径中。实现方式可以通过设置LD_LIBRARY_PATH环境变量:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
或者是设置java.library.path系统属性
java -Djava.library.path=. HelloNaticeTest
好了,java可以找到我们了。

一些本地代码的共享库必须先运行初始化代码。你可以把初始化代码放到JNI_OnLoad方法中。类似的,如果你提供该方法,当虚拟机关闭时,将会调用JNI_OnUnload方法。
它们的原型是:
jint JNI_OnLoad(JavaVM* vm, void* reserved);
void JNI_OnUnLoad(JavaVM* vm, void* reserved);
OnLoad返回所需的虚拟机的最新版本,如:
JNI_VERSION_1_2.

现在,从上到下的调用都讲明白了,下次,我们再继续深入吧。
1 楼 test_angel 2012-06-04  
我在编译so库的时候报以下错误:指点指点

error: expected constructor, destructor, or type conversion before ‘void’
2 楼 test_angel 2012-06-04  
test_angel 写道
我在编译so库的时候报以下错误:指点指点

error: expected constructor, destructor, or type conversion before ‘void’



我知道原因了:jni.h的位置没有给正确。现在已经可以了!
3 楼 nanapoleon 2012-06-05  
test_angel 写道
test_angel 写道
我在编译so库的时候报以下错误:指点指点

error: expected constructor, destructor, or type conversion before ‘void’



我知道原因了:jni.h的位置没有给正确。现在已经可以了!

好吧,刚看到你的留言。。。

    
最新技术文章:
▪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