先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
同样修改后发现居然运行不起来,百度上找了一大堆文章都没能解决问题,想起来之前一位同事说简书要比csdn上的可靠,所以一大早来到公司就上简书搜索,果然不出所料,才看了两篇就找到想要的答案了,就是上面参考的那位大哥的文章,文章不繁琐,结构清晰,做过硬件开发的Android或者玩过串口的朋友一看就知道怎么回事,好了废话不多说,在这里还有两个文件没有贴出来,下面贴一下serial-port.cpp代码
//
// Created by Administrator on 2019\1\29 0029.
//
#include <jni.h>
#include
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include “android/log.h”
static const char *TAG=“serial_port”;
#define LOGI(fmt, args…) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)
#define LOGD(fmt, args…) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
#define LOGE(fmt, args…) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
static speed_t getBaudrate(jint baudrate)
{
switch(baudrate) {
case 0: return B0;
case 50: return B50;
case 75: return B75;
case 110: return B110;
case 134: return B134;
case 150: return B150;
case 200: return B200;
case 300: return B300;
case 600: return B600;
case 1200: return B1200;
case 1800: return B1800;
case 2400: return B2400;
case 4800: return B4800;
case 9600: return B9600;
case 19200: return B19200;
case 38400: return B38400;
case 57600: return B57600;
case 115200: return B115200;
case 230400: return B230400;
case 460800: return B460800;
case 500000: return B500000;
case 576000: return B576000;
case 921600: return B921600;
case 1000000: return B1000000;
case 1152000: return B1152000;
case 1500000: return B1500000;
case 2000000: return B2000000;
case 2500000: return B2500000;
case 3000000: return B3000000;
case 3500000: return B3500000;
case 4000000: return B4000000;
default: return -1;
}
}
static void throwException(JNIEnv *env, const char *name, const char *msg)
{
jclass cls = env->FindClass(name);
/* if cls is NULL, an exception has already been thrown */
if (cls != NULL) {
env->ThrowNew(cls, msg);
}
/* free the local ref */
env->DeleteLocalRef(cls);
}
extern “C”
JNIEXPORT jobject JNICALL
Java_com_deemons_serialportlib_SerialPort_open
(JNIEnv *env, jobject instance, jstring path, jint baudrate,jint parity, jint dataBits, jint stopBit, jint flags)
{
int fd;
speed_t speed;
jobject mFileDescriptor;
/* Check arguments */
{
speed = getBaudrate(baudrate);
if (speed == -1) {
throwException(env, “java/lang/IllegalArgumentException”, “Invalid baudrate”);
return NULL;
}
if (parity <0 || parity>2) {
throwException(env, “java/lang/IllegalArgumentException”, “Invalid parity”);
return NULL;
}
if (dataBits <5 || dataBits>8) {
throwException(env, “java/lang/IllegalArgumentException”, “Invalid dataBits”);
return NULL;
}
if (stopBit <1 || stopBit>2) {
throwException(env, “java/lang/IllegalArgumentException”, “Invalid stopBit”);
return NULL;
}
}
/* Opening device */
{
jboolean iscopy;
const char *path_utf = env->GetStringUTFChars(path, &iscopy);
LOGD(“Opening serial port %s with flags 0x%x”, path_utf, O_RDWR | flags);
fd = open(path_utf, O_RDWR | flags);
LOGD(“open() fd = %d”, fd);
env->ReleaseStringUTFChars(path, path_utf);
if (fd == -1)
{
throwException(env, “java/io/IOException”, “Cannot open port”);
return NULL;
}
}
/* Configure device */
{
struct termios cfg;
LOGD(“Configuring serial port”);
if (tcgetattr(fd, &cfg))
{
LOGE(“tcgetattr() failed”);
close(fd);
throwException(env, “java/io/IOException”, “tcgetattr() failed”);
return NULL;
}
cfmakeraw(&cfg);
cfsetispeed(&cfg, speed);
cfsetospeed(&cfg, speed);
/* More attribute set */
switch (parity) {
case 0: break;
case 1: cfg.c_cflag |= PARENB; break;
case 2: cfg.c_cflag &= ~PARODD; break;
}
switch (dataBits) {
case 5: cfg.c_cflag |= CS5; break;
case 6: cfg.c_cflag |= CS6; break;
case 7: cfg.c_cflag |= CS7; break;
case 8: cfg.c_cflag |= CS8; break;
}
switch (stopBit) {
case 1: cfg.c_cflag &= ~CSTOPB; break;
case 2: cfg.c_cflag |= CSTOPB; break;
}
if (tcsetattr(fd, TCSANOW, &cfg))
{
LOGE(“tcsetattr() failed”);
close(fd);
/* TODO: throw an exception */
return NULL;
}
}
/* Create a corresponding file descriptor */
{
jclass cFileDescriptor = env->FindClass(“java/io/FileDescriptor”);
jmethodID iFileDescriptor = env->GetMethodID(cFileDescriptor, “”, “()V”);
jfieldID descriptorID = env->GetFieldID(cFileDescriptor, “descriptor”, “I”);
mFileDescriptor = env->NewObject(cFileDescriptor, iFileDescriptor);
env->SetIntField(mFileDescriptor, descriptorID, (jint)fd);
}
return mFileDescriptor;
}
最后
我坚信,坚持学习,每天进步一点,滴水穿石,我们离成功都很近!
以下是总结出来的字节经典面试题目,包含:计算机网络,Kotlin,数据结构与算法,Framework源码,微信小程序,NDK音视频开发,计算机网络等。
字节高级Android经典面试题和答案
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
网络等。
字节高级Android经典面试题和答案
[外链图片转存中…(img-Bp4xiHrG-1713664923856)]
[外链图片转存中…(img-EsaefVez-1713664923856)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-TuPakO75-1713664923856)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!