资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

android封装,Android封装jar包

android 怎么封装jni

一、底层实现:

我们提供的服务有:网站建设、成都网站建设、微信公众号开发、网站优化、网站认证、麒麟ssl等。为千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的麒麟网站制作公司

c文件:hardware/libhardware_legacy/power/power.c

以其中set_screen_state(int)函数为例

其Android.mk中添加:

LOCAL_MODULE:= libpower 编译成lib

LOCAL_SRC_FILES += power.c

hardware/libhardware_legacy/power/power.c

1: int

2: set_screen_state(int on)

3: {

4: QEMU_FALLBACK(set_screen_state(on));

5:

6: LOGI("*** set_screen_state %d", on);

7:

8: initialize_fds();

9:

10: //LOGI("go_to_sleep eventTime=%lld now=%lld g_error=%s\n", eventTime,

11: // systemTime(), strerror(g_error));

12:

13: if (g_error)

14: goto failure;

15:

16: char buf[32];

17: int len;

18: if(on)

19: len = snprintf(buf, sizeof(buf), "%s", on_state);

20: else

21: len = snprintf(buf, sizeof(buf), "%s", off_state);

22:

23: buf[sizeof(buf) - 1] = '\0';

24: len = write(g_fds[REQUEST_STATE], buf, len);

25: if(len 0) {

26: failure:

27: LOGE("Failed setting last user activity: g_error=%d\n", g_error);

28: }

29: return 0;

30: }

其头文件power.h中:

1: #if__cplusplus

2: extern "C" { //注1

3: #endif

4: enum {

5: PARTIAL_WAKE_LOCK = 1, // the cpu stays on, but the screen is off

6: FULL_WAKE_LOCK = 2 // the screen is also on

7: };

8:

9: // while you have a lock held, the device will stay on at least at the

10: // level you request.

11: int acquire_wake_lock(int lock, const char* id);

12: int release_wake_lock(const char* id);

13:

14: // true if you want the screen on, false if you want it off

15: int set_screen_state(int on);

16:

17: // set how long to stay awake after the last user activity in seconds

18: int set_last_user_activity_timeout(int64_t delay);

19:

20:

21: #if __cplusplus

22: } // extern "C"

23: #endif

注1:

注1:extern表示其他的类已经定义了这段代码里面的内容,这里只是做声明。

"C”表示的一种编译和连接规约,这里为下一步c++调用其做准备.

比如void foo(int,int);该函数被C编译器编译后在库中的名字为_foo,

而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。

由于编译后的名字不同,C++程序不能直接调用C函数。

因此C++提供了一个C连接交换指定符号extern“C”来解决这个问题而不是一种语言。

C表示这段代码可以是符合C语言的编译和连接规约的任何语言,如Fortran、assembler等。

二、cpp构成jni桥梁

一个CPP文件调用之,则需添加其头文件,比如frameworks/base/core/jni/android_os_Power.cpp.

1: #include "JNIHelp.h"

2: #include "jni.h"

3: #include "android_runtime/AndroidRuntime.h"

4: #include hardware_legacy/power.h

5: namespace android{

6: ....

7:

8: //定义函数:

9: static int setScreenState(JNIEnv *env, jobject clazz, jboolean on)

10: {

11: return set_screen_state(on);//以此实现cpp到c的调用

12: }

13:

14: static JNINativeMethod method_table[] = {//此处实现java对cpp的调用转化 注2

15: { "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },

16: { "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },

17: { "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },

18: { "setScreenState", "(Z)I", (void*)setScreenState },

19: { "shutdown", "()V", (void*)android_os_Power_shutdown },

20: { "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },

21: };

22: int register_android_os_Power(JNIEnv *env) //此处注册jni

23: { //向VM(即AndroidRuntime)登记 gMethods[]表格所含的本地函数

24: return AndroidRuntime::registerNativeMethods(

25: env, "android/os/Power",

26: method_table, NELEM(method_table));

27: }

28: };

注2:

typedef struct {

const char* name; //Java中函数的名字

const char* signature; //用字符串是描述了函数的参数和返回值

void* fnPtr; //函数指针,指向C函数

} JNINativeMethod;

其中比较难以理解的是第二个参数,例如

"()V"

"(II)V"

"(Ljava/lang/String;Ljava/lang/String;)V"

实际上这些字符是与函数的参数类型一一对应的。

"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Func();

"(II)V" 表示 void Func(int, int);

具体的每一个字符的对应关系如下

字符 Java类型 C类型

V void void

Z jboolean boolean

I jint int

J jlong long

D jdouble double

F jfloat float

B jbyte byte

C jchar char

S jshort short

数组则以"["开始,用两个字符表示

[I jintArray int[]

[F jfloatArray float[]

[B jbyteArray byte[]

[C jcharArray char[]

[S jshortArray short[]

[D jdoubleArray double[]

[J jlongArray long[]

[Z jbooleanArray boolean[]

上面的都是基本类型。如果Java函数的参数是class,则以"L"开头,以";"结尾中间是用"/" 隔开的包及类名。而其对应的C函数名的参数则为jobject. 一个例外是String类,其对应的类为jstring

Ljava/lang/String; String jstring

Ljava/net/Socket; Socket jobject

如果JAVA函数位于一个嵌入类,则用$作为类名间的分隔符。

例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"

三、java的封装实现

frameworks/base/core/java/android/os/Power.java //此处路径跟cpp中注册jni处的路径是一致的.待细研究是否有关系

1: package android.os;

2: public class Power

3: {

4: ...

5: public static native int setScreenState(boolean on); //被native修饰的表示调用了非java语言的本地方法

6: ...

7: }

四、java中对其调用

frameworks/base/services/java/com/android/server/PowerManagerService.java

import android.os.Power;

public class PowerManagerService extends IPowerManager.Stub

implements LocalPowerManager, Watchdog.Monitor {

...

int err = Power.setScreenState(on);

...

}

Android Log日志封装

一、简介

为什么要对日志进行封装?

封装前:快捷键输入loge便可打印出Log.e(TAG, "onCreate: ", );需要输入参数TAG和参数msg。 且我们可以在Logcat页面查看日志信息。

缺点:

(1)输入的参数较多且重复

(2)当打印的日志信息过多时,不方便查找我们所需的信息

(3)无法快速指定是哪一行打印出来的信息

(4)应用发布到市场上时,需要手动一个个删除打印的日志

封装后:只需输入你想打印的msg,使用方便。且可以在Logcat页点击类名即可跳转到相应的位置。

二、Log具体封装

android 应用依赖某个库怎么封装成sdk

方法一

使用eclipse导出jar包:我们知道一个java项目是可以用eclipse导出jar包的,安卓工程也一样,只要按普通的方法export就可以了。不过,export出来的包是没有混淆过的,如果你要混淆,还需要单独对你的jar包执行一次proguard程序,可参考proguard使用指南。

方法二

使用脚本打包:我个人比较喜欢该方法,因为android工程项目并不是只有JAVA代码,有的资源也需要提供出来,而使脚本可以更加定制化一些。

android的SDK默认提供了一个ant打包的脚本,具体使用方法,可参考之前的BLOG,使用ant打包APK及依赖包最佳解决办法

我们可以看出,打包,最终调用的其实是android sdk下的ant脚本,既然安卓已经帮我们写好了ant脚本,我们就好好利用。

使用上面的BLOG中介绍的方法,先在工程目录中生成你的build.xml,然后自己写一个target

target name="sdk"

depends="-set-release-mode, -release-obfuscation-check, -compile, -post-compile, -obfuscate"

/target

这段target代码,就是只执行到了混淆的脚本。然后我们在build.xml中选择右键,run as, 第二个ant Build,然后选择要执行的target为我们加上的sdk。

等执行完成后,就会在project/bin/proguard/obfuscated.jar找到你所要的jar包。

android listview是怎么封装的

从你的问题中我总结出来的知识点包括: cursor查询数据库中的数据 AsyncTask异步操作 创建listview有关的Adapter适配器 大体流程操作如下: 由于数据库操作属于耗时操作,因此要放在异步线程中执行,cursor在查询出数据以后,封装到集合当中,这就需要我们首先定义出一个实体类bean。bean中包含你从数据库中cursor出来的字段。查询出来的字段封装到bean中,然后通过Adapter适配器将插叙出来的数据进行显示。 下面写出关键代码: cursor查询数据库 Cursor cursor = database.rawQuery("select * from 表名 where 字段='查询字段'",null);代码封装到bean中:while (cursor.moveToNext()) {Bean bean = new Bean();bean.setId(cursor.getString(0));bean.setName(cursor.getString(1));XXXX.add(XXXXbean);}创建Adapter适配器: listViewAdapter = new ListViewAdapter(this, XXXX); // 创建适配器 XXXX_list.setAdapter(listViewAdapter);bean实体类代码、Adapter设置数据代码略

Android里的封装,继承,多态,都是表现在哪里,都是有什么方法,有什么

封装,例如android中一个View就是封装了一系列的方法,这些方法系统已经给你封装好了,你只需要去调用即可。

继承,例如一个Activity(界面),创建一个界面就需要去继承它,因为android中每个界面都是一个activity组成的(Fragment也是运行在activity中的)。

多态,这个比较抽象也比较难解释,就像一个View,给它注册一个点击事件来说吧,系统用的只是一个接口,但是用户可以用一个实现接口的类来处理这个点击事件,这就是多态性,因为对于android来讲,它根本不知道用户会起个什么名实的类,它只要你实现它的接口即可。

android开发封装是什么意思?

开发封装就是将设计调试好的程序,进行打包封装成用户可以接受的!此项包括安装界面,程序说明,帮助文档,版本信息等等


本文名称:android封装,Android封装jar包
本文地址:http://www.cdkjz.cn/article/dsdihdi.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220