当前位置:首页 » 安卓系统 » android如何封装

android如何封装

发布时间: 2023-04-19 04:06:02

㈠ 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 怎么封装jni

一、底层实现:

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);
...
}

㈣ Kotlin Coroutine在 Android 中的使用和封装

kotlin出来很多年,并被google被赋予Android首选开发语言的地位,还是有必要研究一下的,基础语法不再复述了,只简单聊聊kotlin中的核心内容之一:协程 Coroutine。

相关概念和API可以直接进入[官网](https://kotlinlang.org/)查询,

不过不推荐kotlin中文网,文章翻译的略显生硬,看了更容易迷惑。

本文不讲基础(基础我也不怎么清楚。。),适合喜欢拿来主义的同学

协程作为轻量级的线程,是建立在线程之上的调度,比线程节省资源但不意味着不消耗资源,在Android这种系统资源相对珍贵的环境中,当异步繁琐的调用或者切换线程,如何及时的回收也是必要的工作。

### 一、添加依赖配置

coroutine 是在kotlin 1.3中发布的1.0正式版,所以建议优先使用这个版本。

项目根目录中gradle配置:

主mole中gradle配置

假如你的其他mole也使用kt代码,也需要添加上述依赖,不然有可能会出现找不到class或符号相关编译错误

二、替换RxJava和升级Retrofit

一般项目中会引用retrofit + RxJava的组合进行网络请求,或者你单独封装了一层RxJava来进行异步操作、切换线程来处理你的业务

RxJava虽然操作符众多(得有100个以上了吧),上手不易,但着实好用,一条链走下来搞定你的全部业务,如果有网络请求配合上retrofit这种支持Rx的库,不要太给力。

不过函数式开发有个通病,这条链子上会创建大量对象,回收内存抖动你不得不考虑,虽然使用了线程池,可开销不容小觑。

RxJava 虽然可以链式调用,但终究还是基于回调形式,而协程完全做到了同步方式写异步代码。

看下以前Retrofit的写法(简易)

RxJava 的调用链上使用RxLife来绑定生命周期(或者使用Uber的autodispose),很常见的代码。

对于RxJava你还有可能会封装一个小工具(主要是为了生命周期和回收问题)

现在呢,想用协程怎么办,假设你现在已经知道了如何启动一个协程

也知道了launch 和 async的区别(返回值不同),也知道了需要一个返回值和多个返回值的选择(async 和 rece),那在Android中如何使用呢

三、封装

你可以像封装RxJava一样,封装一个工具来使用协程,同时遵循一些原则:

#### 1 调度器

你开启的协程需要有调度器,就像RxJava自由切换线程一样,但主线程调度器最好察配迅指定Main来避免不必要的麻烦。

举个例子,你使用RxJava+autodipose来绑定 生命周期,但你在子线程用RxJava又开启了一个新线程,调度回UI线程刷新view的时候会发生崩溃

#### 2 父协程和子协程有强烈的层级关系

cancel一个Job 会抛出 CancellationException ,但这个异常不需要开发人员管理,但如果协程内部发生了非 CancellationException ,则会使用这个异常来取消父Coroutine。为了保证稳定的Coroutine层级关系,这败此种行为不能被修改。 然后当所有的子Coroutine都终止后,父Coroutine会收到原来抛出的异常信息。

下边是个协程的简易封装案例

context 视业务情况而定是否传入

然后在你的act或Fragment中直接调用

对于Retrofit修改更为简单,2.6版本已经支持了协程,网上有很多介绍

将Observable返回值修改为你需要的bean, 加上suspend标记即可,

下边是示例代码:

### 四、混淆

网上的帖子大多以demo的思路来写,商用肯定要混淆了,不添加proguard你混淆后就死翘翘了,所以直接贴上来

coroutine的配置

假如release打包后你的Retrofit 请求结果发生了npe,检查下你的bean是否添加了不混淆配置

### 其他

研究协程没多久,有错误或建议欢卖李迎指出,共同交流

另外推荐云在千峰的[博客](http://blog.chengyunfeng.com/?p=1088) ,是我目前看过的最友好的coroutine系列文章

㈤ Android 基类BaseActivity的封装

摘要
本篇总结了前人写的BaseActivity,自己在开发过程中也添添补补,删删改改,现在总结下。

本篇很多知识借鉴和学习了知乎上iYng大大的回答,先感谢一波。顺便上原文链接:
https://www.hu.com/question/47045239/answer/105086885

正文
一般来说,不同的项目的BaseActivity不尽相同,根据不同的业务逻辑和功能需求,会有很多区别。这里总结了一些,如下:

视图相关
一般的Activity里都会用到很多的findViewById这个方法,而且每次都要强制类型转换,这样会显得很繁琐,如果在BaseActivity里封装好,就能省事:

这样只要是继承了BaseActivity就能轻松使用LinearLayout llContent = findView(R.id.ll_content);,免去了诸多类型转换的麻烦。

然后说起视图,一般的Activity里都会需要初始化视图和数据,所以可以暴露两个方法initView()和initData():

然后在setContentView里去调用,一般都是先initView,然后再initData:

这样子类里都必须重写initView()和initData()了,逻辑也能清晰点,不然什么东西都放在onCreate里,就很乱了;

用户模块(业务相关【可选】)
不过一般的app,只要是有登录的,就会有用户模块,也会根据用户标识id去进行一些网络操作,所以用户模块可以在BaseActivity中暴露一些方法,比如用户id的获取:

这里就是返回了SharedPreference里存储的用户id,在用户id大量被使用的场景下,这样的封装还是很有必要的,使用起来也更便捷。当然如果只是纯展示的app就不一定需要了,或许显得多余。

界面间跳转传参
很多时候,Activity之间都会传参,所以可以封装一个参数处理的函数initParam(),在BaseActivity的onCreate里去判断是否有参数传过来;

然后把initParam()方法暴露给子类:

这个方法并不是必须重写的,因为传参也没有想象中那么多,并不需要强制重写这个方法。

一般会在Application类里去定义一个isDebug来判断是否开启调试(开发者模式):

在BaseActivity里,我们可以把isDebug作为总开关,然后控制是否显示调试信息:

这样一键关闭调试,不用去一个个删项目里的Log信息,是不是很赞?

每次Toast,都用Toast.makeText(...).show();是不是很烦?那么可以在BaseActivity里封装下,比如:

这里ToastUtils就是一个Toast封装类,里面的内容估计大家都懂。然后这样一来,所有子类在使用时,只需要潇洒写一句toast("xxxx")就行了,当然也可以一并封装Toast.LENGTH_LONG和Toast.LENGTH_SHORT,按需封装吧。

其他
软键盘
有的app里,用户输入的情景会比较多,这个时候,软键盘的隐藏就用的多了,用户输入完之后,或者用户点击屏幕空白处,都应该去隐藏软键盘,这样的话,可以考虑在BaseActivity里写隐藏的方法:

上面3个方法也是很实用的。dispatchTouchEvent方法不需要手动调用,只要是有点击事件,并且点击在软键盘和EditText区域外,就会隐藏软键盘。

防止快速点击
有时候,用户(特别是测试猿)会疯狂的点击app,这一举动的原因和意义不明,但是我们可以设置防止快速点击给app造成的伤害和负担:

这样在1秒之内只会响应一次,麻麻再也不用担心我手抽筋乱点了。
那么怎么用呢?举个栗子,可以在onClick接口里去判断下嘛:

页面跳转:startActivity、startActivityForResult
这个也是可选的,可以封装下,达到每次跳转不需要传this或者XXXXX.this这种参数:

这些方法还是很便捷的,使用时可以简单的使用startActivity(MainActivity.class);,也可以传Bundle参数。

是否允许全屏
设置一个成员变量mAllowFullScreen

通过在BaseActivity的onCreate方法里判断mAllowFullScreen来设置是否允许全屏:

然后给子类暴露一个方法来设置mAllowFullScreen:

设置沉浸式状态栏
跟设置全屏一样一样的:

然后BaseActivity的onCreate里:

然后定义steepStatusBar()方法,用来设置沉浸式状态栏:

这里就要判断系统版本了。只有在KITKAT以上才有作用。
最后给子类暴露方法,设置 isSetStatusBar的值:

设置是否允许屏幕旋转
跟前面两种思路一样,通过判断变量,在onCreate里设置咯:

BaseActivity里的onCreate方法:

最后暴露方法设置isAllowScreenRoate的值:

总结
上面的这些方法大都是比较常用的,有些虽然不是很常用,但是写了也会方便一点,把这篇文章当做一个汇总,然后按需使用呗。

㈥ 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包。

㈦ React-Native-Android怎么封装原生组件

Android React Native 已经将几个常用的原生组件进行了封装,比如 ScrollView 和 TextInput,但是并不是所有系统的原始组件都被封装了,因此有的时候我们不得不自己动手封装一下,从而能够使用那些React Native没有为我们封装的原生组件,比如WebView,官方并没有提供Android端的实现,那么我们现在就动手封装一下WebView。

之前写过一篇文章Android React Native使用原生模块,而使铅亮用原生UI组件的方法和使用原生模块的方法十分类似。

首先,我需要继承SimpleViewManager这个泛型类,和原生掘激芦模块类似,需要重写getName()方法,将UI组件名称暴露给javascript层,接着需要重写createViewInstance方法,在里判带面返回我们需要使用的原生UI组件的实例,这里就是WebView。然后就是暴露一些必要属性给javascript层,为了简单起见,我们这里只暴露两个属性,一个是url,一个是html,一旦javascript层设置了url,就会加载一个网页,而一旦设置了html,则会去加载这段html,而属性的暴露是使用注解,将注解设置在对应的set方法上,之后再set方法中处理UI的更新,比如一旦设置了url,在setUrl里面就要加载网页。最终我们的ViewManager就是这样子的

public class ReactWebViewManager extends SimpleViewManager<WebView> {
public static final String REACT_CLASS = "RCTWebView";
@Override
public String getName() {
return REACT_CLASS;
}

@Override
protected WebView createViewInstance(ThemedReactContext reactContext) {
WebView webView= new WebView(reactContext);
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
return webView;
}

@ReactProp(name = "url")
public void setUrl(WebView view,@Nullable String url) {
Log.e("TAG", "setUrl");
view.loadUrl(url);
}
@ReactProp(name = "html")
public void setHtml(WebView view,@Nullable String html) {
Log.e("TAG", "setHtml");
view.loadData(html, "text/html; charset=utf-8", "UTF-8");
}
}

和原生模块一样,原生UI组件也需要进行注册,实现ReactPackage接口,进行WebView的注册。

public class AppReactPackage implements ReactPackage {
@Override
public List<NativeMole> createNativeMoles(ReactApplicationContext reactContext) {

return Collections.emptyList();;
}

@Override
public List<Class<? extends JavaScriptMole>> createJSMoles() {
return Collections.emptyList();
}

@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Arrays.<ViewManager>asList(
new ReactWebViewManager());
}
}

将这个ReactPackage添加到ReactInstanceManager实例中去

.addPackage(new AppReactPackage())

然后在javascript层新建一个WebView.js文件。输入下面的内容

'use strict';

var { requireNativeComponent,PropTypes } = require('react-native');

var iface = {
name: 'WebView',
propTypes: {
url: PropTypes.string,
html: PropTypes.string,
},
};

mole.exports = requireNativeComponent('RCTWebView', iface);

可以看到,我们只是在里面指定了属性的类型。

到目前为止,你已经可以使用这个WebView组件了。

var WebView=require('./WebView');

㈧ React-Native-Android怎么封装原生组件

参考如下内容:首先在Android中嵌入ReactNative:每一个AndroidStudioproject下包含多个mole,所以,从命令行进入到mole根目录,运行:[plain]viewplain$npminit$npminstall--savereact-native$curl-o.flowconfig/facebook/react-native/master/.flowconfig上述命令会创建一些react-native依赖的一些模块,在package.json文件的scripts属性中添加:[javascript]viewplain"start":"nodenode_moles/react-native/local-cli/cli.jsstart"注:如果scripts中存在其他键值对,则以逗号为分隔符。在mole的根目录创建index.android.js文件,并将一下内容下入index.android.js文件:[javascript]viewplain'usestrict';importReactfrom'react';import{AppRegistry,StyleSheet,Text,View}from'react-native';classHelloWorldextendsReact.Component{render(){return(Hello,World)}}varstyles=StyleSheet.create({container:{flex:1,justifyContent:'center',},hello:{fontSize:20,textAlign:'center',margin:10,},});AppRegistry.registerComponent('HelloWorld',()=>HelloWorld);在AndroidStudio中,在moudle的build.gradle文件中添加一下内容:[javascript]viewplainallprojects{repositories{maven{//AllofReactNative(JS,Androidbinaries)isinstalledfromnpmurl"$rootDir/node_moles/react-native/android"}}}在AndroidManifest.xml文件中添加网络访问权限(仅在开发或调试中需要该权限):

㈨ android 怎么封装jni

android 怎么封装jni

一、底层实现:
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 ", 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] = ''
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 ", 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//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/javaandroid/server/PowerManagerService.java
import android.os.Power;
public class PowerManagerService extends IPowerManager.Stub
implements LocalPowerManager, Watchdog.Monitor {
...
int err = Power.setScreenState(on);
...
}

android size 怎么封装

[] view plain print?
<resources>

<!-- Base application theme. -->
<style name=AppTheme parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name=colorPrimary>@color/colorPrimary</item>
<item name=colorPrimaryDark>@color/colorPrimaryDark</item>
<item name=colorAent>@color/colorAent</item>
</style>
<style name=text_18_ffffff>
<item name=android:textSize>18

android怎么封装customsharelistener

以下专案所需要的jar包,图片等资源可到该网站下载SDK即可。
连结::dev.umeng./social/android/quick-integration?spm=0.0.0.0.LkoxNn
首先要引入相应的jar包,我用了友盟整合的jar包,选择相应的进行汇入。
在下载的SDK中有一个工具:umeng_integrate_tool.jar,使用它生成自己想要的jar包和资源

方法一: 网络一下“安智市场” 点选历史版本就能找到以前的版本下载了 方法二: 1.用360软体管家下载安装豌豆荚2.54版本 2.用豌豆荚搜寻“微信”点选右下角的更多微信版本 3.这里能找到不同网站的所有历史版本下载

android 怎么封装titlebar

Android标题栏新增控制元件及Button控制元件背景颜色的设定一、Android中标题栏新增按现在很多的Android程式都在标题栏上都显示了一些按钮和标题,如下图:下面通过例项来看一下如何实现。1、在layout下建立一个titlebtn.xml档案,内容如下:在创

android sharesdk登陆怎么封装

(1)Activity或Fragment实现ShareCallback 回拨方法
回拨方法如下:
public interface ShareCallback {
分享成功
void shareSuess(Platform platform, int i, HashMap<String, Object> hashMap);
分享失败
void shareError(Platform platform, int i, Throwable throwable);
取消分享
void shareCancel(Platform platform, int i);
}

android怎么封装json资料

public static String getJsonStr(){
try {
JSONObject object1 = new JSONObject();

android studio pickerview 资料怎么封装

封装就是资料打包,拆包就是解包。1般传送方把需要传送的资料打包发出去后,接收方收到包后解包解出资料。

android怎么封装ui元件库

封装就是要主要不要和任务相关,提供的接口要尽量合理和便捷使用.

android android怎么将布局档案封装

要看你的view是一个dialog还是一个普通的view.
单纯的渲染apple.xml的话,用inflater就可以。但是你要显示的话,要么是在一个dialog上,要么是新增的activity的view中,这个时候你要有一个viewgroup作为你的apple view的parent

㈩ android全局通用方法怎么封装

  • 使用静态类:

public class Data{

private static String a ="Hello Android";

public static String getA() {

return a;

}

public static void setA(String a) {

Data.a = a;

}

}

调用就不再写了,直接使用类名.变量名就可以调用!

使用Application

/**

* 自定义的MyApplication继承Application

*

*

*/

public class MyApplication extends Application {

/**

* 引发异常:在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的 null pointer异常。

*/

/**

* 异常分析:Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或

* Service所占用的内存。当应用再次去调用静态属性或对象的时候,就会造成null pointer异常

*/

/**

* 解决异常:Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成null pointer异常

*/

private int number;

@Override

public void onCreate() {

// TODO Auto-generated method stub

super.onCreate();

}

public int getNumber() {

return number;

}

public void setNumber(int number) {

this.number = number;

}

}

热点内容
随机启动脚本 发布:2025-07-05 16:10:30 浏览:510
微博数据库设计 发布:2025-07-05 15:30:55 浏览:14
linux485 发布:2025-07-05 14:38:28 浏览:296
php用的软件 发布:2025-07-05 14:06:22 浏览:747
没有权限访问计算机 发布:2025-07-05 13:29:11 浏览:419
javaweb开发教程视频教程 发布:2025-07-05 13:24:41 浏览:669
康师傅控流脚本破解 发布:2025-07-05 13:17:27 浏览:229
java的开发流程 发布:2025-07-05 12:45:11 浏览:672
怎么看内存卡配置 发布:2025-07-05 12:29:19 浏览:271
访问学者英文个人简历 发布:2025-07-05 12:29:17 浏览:821