当前位置: 编程技术>移动开发
本页文章导读:
▪本土方法调用3 本地方法调用3
继续本地调用的相关知识。前面已经讲过了关于java如何调用下面的相关知识,包括如何适配变量,jni调用的方法规范,以及一些jni方法调用的注意事项等等。 根.........
▪ 自动调整TextView字体大小以顺应文字长度 自动调整TextView字体大小以适应文字长度
package me.mcar.parking.control;
import android.content.Context;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;
public class AutoAjustSizeTextVi.........
▪ Sencha touch、JQuery Mobile抉择 Sencha touch、JQuery Mobile取舍
jquery mobile和sencha touch是两个不错的HTML 5开发框架,下面小结两者的一些 特点如下 jquery mobile: 1) jQM是一个UI类库可以看作,主要依赖于jquery和jquery ui 2) jqm做的一些.........
[1]本土方法调用3
来源: 互联网 发布时间: 2014-02-18
本地方法调用3
继续本地调用的相关知识。前面已经讲过了关于java如何调用下面的相关知识,包括如何适配变量,jni调用的方法规范,以及一些jni方法调用的注意事项等等。
根据前面的介绍,我们可以发现,调用的过程,如果真的使用起来,并没有很顺手,因为仅仅只有参数的向下传递是绝对不够的。我们不仅要下层的代码访问上层的,还要来回调用彼此之间的方法,这样做才够cool嘛。而且才能灵活满足各种需求。就像佛经所说:能进能退,乃真正法器(形容能进能退,进退有度,赵云式的霸气),有木有?
那先来介绍下访问实例域吧。在java程序中,有很多方法,会使用到类中的全局变量,比如下面的代码:
很常见的方法吧?现在呢,我们要把这个raiseSalary变成一个本地方法。根据前面内容,javah可以生成一个如下方法
看到这个方法,你能看出和先前讲得有什么不同么?什么?能进能退?我代表赵云,给你跪了。。。咳,我们看到,有两个不同处,第一个,salary变量是一个Employee的变量,并没有被通过参数传入到c层中。这个我们要稍后重点介绍。还有一个,看看第二个传入参数,可以看到,前面由于使用的是static静态方法,所以,传递进来的是jclass,而这里,我们看到传进来的是jobject。这个也很合理,因为静态方法是没有对象的嘛。
好了,有java对象传下来,后面就很好想象了,对吧。不过,直接访问要求虚拟机暴露它们的内部数据布局,因此,JNI要求程序员通过调用特殊的JNI函数来获取和设置数据的值。这里我们要使用GetdoubleField和SetDoubleField函数,当然还有其他类型,一般语法是:
这里,又产生了两个疑问,一个是fieldID是个什么东东?还有,GetObjectField方法返回的对象,我们用什么class定义它?
先看看FieldID,它是一个特殊类型的值,fieldID表示结构中的一个域。使用GetFieldID函数来获得fieldID。
字符串"D"表示类型是double。这个后面介绍。
感觉有点像纹理id有没有?JNI的设计者不想把数据域直接暴露在外,所以,他们不得不提供获取和设置数据域值的函数。为了使这些函数的开销最小化,从域名计算域ID(代价最大的一个步骤)被分解出来作为单一步骤。这样,如果你反复获取和设置一个特定的域,你计算域标示符的开销只有一次。
第二点,如何得到一个class?jni有两种方式得到class:
FindClass函数可以让你以字符串形式来指定类名(很奇怪的是使用/来代替包分割符号.)
看起来有点像反射,是吧。(越往后看,其实jni的java层的method调用也是反射的形式,他们分别对应了反射的field和method)
好了,大概介绍完了如何访问java的域,我们最后做个总结,把开始的方法完全转换成jni层的代码:
继续本地调用的相关知识。前面已经讲过了关于java如何调用下面的相关知识,包括如何适配变量,jni调用的方法规范,以及一些jni方法调用的注意事项等等。
根据前面的介绍,我们可以发现,调用的过程,如果真的使用起来,并没有很顺手,因为仅仅只有参数的向下传递是绝对不够的。我们不仅要下层的代码访问上层的,还要来回调用彼此之间的方法,这样做才够cool嘛。而且才能灵活满足各种需求。就像佛经所说:能进能退,乃真正法器(形容能进能退,进退有度,赵云式的霸气),有木有?
那先来介绍下访问实例域吧。在java程序中,有很多方法,会使用到类中的全局变量,比如下面的代码:
class Employee{
double salary = 0;
public void raiseSalary(double byPercent){
salary += 1 + byPercent / 100;
}
}很常见的方法吧?现在呢,我们要把这个raiseSalary变成一个本地方法。根据前面内容,javah可以生成一个如下方法
JNIEXPORT void JNICALL Java_Employee_raiseSalary(JNIEnv *, jobject, jdouble)
看到这个方法,你能看出和先前讲得有什么不同么?什么?能进能退?我代表赵云,给你跪了。。。咳,我们看到,有两个不同处,第一个,salary变量是一个Employee的变量,并没有被通过参数传入到c层中。这个我们要稍后重点介绍。还有一个,看看第二个传入参数,可以看到,前面由于使用的是static静态方法,所以,传递进来的是jclass,而这里,我们看到传进来的是jobject。这个也很合理,因为静态方法是没有对象的嘛。
好了,有java对象传下来,后面就很好想象了,对吧。不过,直接访问要求虚拟机暴露它们的内部数据布局,因此,JNI要求程序员通过调用特殊的JNI函数来获取和设置数据的值。这里我们要使用GetdoubleField和SetDoubleField函数,当然还有其他类型,一般语法是:
x = (*env)->GetXxxField(env, this_obj, fieldID); (*env)->SetXxxField(env, this_obj, fieldID, x);
这里,又产生了两个疑问,一个是fieldID是个什么东东?还有,GetObjectField方法返回的对象,我们用什么class定义它?
先看看FieldID,它是一个特殊类型的值,fieldID表示结构中的一个域。使用GetFieldID函数来获得fieldID。
jfieldID id_salary = (*env)->GetFieldID(env, class_Employee, "salary", "D");字符串"D"表示类型是double。这个后面介绍。
感觉有点像纹理id有没有?JNI的设计者不想把数据域直接暴露在外,所以,他们不得不提供获取和设置数据域值的函数。为了使这些函数的开销最小化,从域名计算域ID(代价最大的一个步骤)被分解出来作为单一步骤。这样,如果你反复获取和设置一个特定的域,你计算域标示符的开销只有一次。
第二点,如何得到一个class?jni有两种方式得到class:
jclass class_Employee = (*env)->GetObjectClass(env, this_obj);
FindClass函数可以让你以字符串形式来指定类名(很奇怪的是使用/来代替包分割符号.)
jclass class_String = (*env)->FindClass(env, "java/lang/String");
看起来有点像反射,是吧。(越往后看,其实jni的java层的method调用也是反射的形式,他们分别对应了反射的field和method)
好了,大概介绍完了如何访问java的域,我们最后做个总结,把开始的方法完全转换成jni层的代码:
JNIEXPORT void JNICALL Java_Employee_raiseSalary(JNIEnv* env, jobject this_obj, jdouble byPercent){
jclass class_Employee = (*env)->GetObjectClass(env, this_obj);
jfieldID id_salary = (*env)->GetFiledID(env, class_Employee, "salary", "D");
jdouble salary = (*env)->getDoubleField(env, this_obj, id_salary);
salary += 1 + byPercent;
(*env)->SetDoubleField(env, this_obj, id_salary, salary);
}
[2] 自动调整TextView字体大小以顺应文字长度
来源: 互联网 发布时间: 2014-02-18
自动调整TextView字体大小以适应文字长度
控件使用方法
package me.mcar.parking.control;
import android.content.Context;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;
public class AutoAjustSizeTextView extends TextView
{
private static float DEFAULT_MIN_TEXT_SIZE = 10;
private static float DEFAULT_MAX_TEXT_SIZE = 16;
// Attributes
private Paint testPaint;
private float minTextSize, maxTextSize;
public AutoAjustSizeTextView(Context context, AttributeSet attrs)
{
super(context, attrs);
initialise();
}
private void initialise()
{
testPaint = new Paint();
testPaint.set(this.getPaint());
maxTextSize = this.getTextSize();
if (maxTextSize <= DEFAULT_MIN_TEXT_SIZE)
{
maxTextSize = DEFAULT_MAX_TEXT_SIZE;
}
minTextSize = DEFAULT_MIN_TEXT_SIZE;
};
/**
* Re size the font so the specified text fits in the text box * assuming
* the text box is the specified width.
*/
private void refitText(String text, int textWidth)
{
if (textWidth > 0)
{
int availableWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight();
float trySize = maxTextSize;
testPaint.setTextSize(trySize);
while ((trySize > minTextSize) && (testPaint.measureText(text) > availableWidth))
{
trySize -= 1;
if (trySize <= minTextSize)
{
trySize = minTextSize;
break;
}
testPaint.setTextSize(trySize);
}
this.setTextSize(trySize);
}
};
@Override
protected void onTextChanged(CharSequence text, int start, int before, int after)
{
super.onTextChanged(text, start, before, after);
refitText(text.toString(), this.getWidth());
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
if (w != oldw)
{
refitText(this.getText().toString(), w);
}
}
}
控件使用方法
<me.mcar.parking.control.AutoAjustSizeTextView
android:id="@+id/parklist_item_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:textColor="#A0A0A0"
android:textSize="12sp" />
[3] Sencha touch、JQuery Mobile抉择
来源: 互联网 发布时间: 2014-02-18
Sencha touch、JQuery Mobile取舍
jquery mobile和sencha touch是两个不错的HTML 5开发框架,下面小结两者的一些
特点如下
jquery mobile:
1) jQM是一个UI类库可以看作,主要依赖于jquery和jquery ui
2) jqm做的一些页面是可以靠JQM本身框架已完成不少功能,甚至不需要或者
很少的javascript
3) 如果是熟JQUERY的话,JQM很容易上手
4) JQM是结构框架上比较松散,所以程序大的时候维护起来稍微麻烦点
5) 能容易跟其他框架整合
6) 支持的设备比sencha touch暂时多点
sencha touch:
1) 框架类库很大,包罗万有,UI,DOM,AJAX等它都包括了
2) 不依赖其他框架类库
3) 学习起来花费时间长点
4) 有很好的框架规范和编程约束,这对中大规模项目来说是好事
5) 提供原生打包(native packaging)功能。只需一条命令,就可以将应用打包为供iOS或Android使用。用户不必编写自己的包裹器,或是再纠缠于其他,现在已经在Sencha Touch 2中全面内置。更好之处在于:用户为iOS或Android打包同时支持Mac和Windows环境。
6) 支持的设备比jqm少些
7) 对localstorage的支持好点
最新技术文章: