目录
01 1-项目结构介绍
02 2-helloworld
1 Android环境搭建
1.1 JDK
下载
jdk 官方下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html
安装
(1)
tar -zxvf jdk-8u101-linux-x64.tar.gz
(2)
cd jdk1.8.0_101/
pwd
得到 jdk 开发环境路径
/home/itcast/BC-Project/jdk1.8.0_101
1.2 Android Studio
下载
我们这里首先要部署android的开发环境,这里我们使用的是Android-studio
下载地址当然就是developer.android.com,但是这个网站需要翻墙。
所以我们在国内一个某个个人代理网站下载也可以。
41 Android环境搭建
http://www.androiddevtools.cn/
找到对应的版本下载即可。
我们这里使用的是 2.1.2 正式版(Linux) android-studio-ide-143.2915827-
linux.zip
03 3-java中的类的基本定义
安装
(1)
unzip android-studio-ide-143.2915827-linux.zip
(2)
cd android-studio/
cd ./bin/
./studio.sh
会出现如上问题。
表示需要设置“STDDIO_JDK, JDK_HOME, JAVA_HOME”三个环境变量。
(3)
vim ~/.bashrc
export JAVA_HMOE=/home/itcast/BC-Project/jdk1.8.0_101
export JDK_HOME=$JAVA_HOME
04 4-java中的值传递和引用传递
(4)
source ~/.bashrc
./studio.sh
第一次运行会出现如下界面。 选择下面这个即可。
71 Android环境搭建
如果遇见如下错误。
81 Android环境搭建
sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 lib32std
c++6
可以解决。
运行
正常安装成功,就可以启动了,我们会看见一个启动界面。 然后按照要求,建立一
个项目就可以了。
1.3 Android和
ADB真机调试
当部署好,并且创建了一个Android项目的时候。
当我们点击
启动程序的时候,我们需要启动一个Android模拟器来启动。但是这样运行的速度
回很慢,所以,我们需要用真机调试。
我们需要借助一个工具 adb
我们在之前安装的Android-SDK中有一个现成的adb工具
/home/itcast/BC-Project/Android-SDK/platform-tools/adb
05 5-java中的常量final
可以直接用这个工具,将这个adb设置到环境的变量PATH里边。
export PATH=$PATH:/home/itcast/BC-Project/Android-SDK/platform-t
ools/
或者直接从ubuntu官网下载:
sudo apt-get install android-tools-adb
安装完毕之后。
adb devices
如果出现 无权限 问题,请用sudo启动,如下:
adb kill-server
sudo adb start-server
这里要注意的事,每个安卓手机的厂商和系统不同,所以在链接的时候,要开
USB调试功能。
而且,要确保安卓手机能够正确的链接到usb,让系统能够检查出来。可以通
过lsusb来查看安卓手机是否已经链接到Linux操作系统上。
调试
如果链接成功,使用adb devices就可以发现一台已经链接到linux 并且通过adb将手
机和Android Studio链接成功的列表:
如下:
itcast:platform-tools$ adb devices
List of devices attached
005a380d device
itcast:platform-tools$
101 Android环境搭建
其中 '005a380d'就是目前我正在调试的安卓手机id号。
回到,Android Studio,点击
选择已经链接好的 真机 Android设备,点击Ok,就可以将编辑好的androidAPK部
署在真机上了。
问题1
如果出现:minsdk(api 15) > devicesdk(api 10) 类似问题。
修改app/src/build.gradle 将 minSdkVersion 改成10, 然后点击 Sync Now 即可。
06 6-java中的static
2 Android的快速建模开发
输出调试信息
使用
Log输出信息
Log类定义在android.util包中,因此需要通过
import android.util.Log
来引入Log类。
使用Log类的接口v, d, i, w, e来实现输出调试信息,其中v表示任何信息,d表示
debug,i表示information,w表示warning,e表示error信息。
输出信息除了内容之外,还有一个tag参数,用于查看时过滤调试信息。
查看调试信息
打开Android Monitor视图,可以选择一些过滤条件查看输出信息。
通过
toast显示信息
Toast.makeText(getApplicationContext(), "信息内容",
Toast.LENGTH_SHORT).show();
可以参考博文 http://android.tgbus.com/Android/tutorial/201103/346236.shtml
122.1 UI控件与代码的关联
2.1 UI控件与代码的关联
界面的布局
把我们创建好的Android项目。
打开./app/src/main/res/layout/activity_main.xml
这是一个布局样式的文件。
打开 design 标签窗口。
通过部署如下界面:
07 7-java中的extends继承和final方法
UI和代码的关联
然后我们打开 MainActivity.java 文件。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
public class MainActivity extends AppCompatActivity {
public Button btn;
public EditText editText_username;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//关联变量和 UI控件,其中 R.id.button 为按钮控件的ID
// R.id.editText_username为用户名EditText的控件ID
btn = (Button)findViewById(R.id.button);
editText_username = (EditText) findViewById(R.id.editTex
t_username);
//设置btn按钮的点击事件
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//获取editText中的数据
String username = editText_username.getText().to
String();
2.1 UI控件与代码的关联
14//打印到控制台
Log.e("MainActivityDebug", username);
}
});
}
}
点击运行:
08 8-instanceof关键字
09 9-java中的array
(3) 在.cpp文件中,定义这个文件,来实现java类型和Cpp类型的转换。
JNIEXPORT jobjectArray JNICALL Java_com_cpp_itcast_testapp_Hello
Jni_testArray
(JNIEnv * env, jobject obj , jintArray java_i_array, jobjectAr
ray java_str_array, jbooleanArray java_b_array)
{
//处理boolean数组
jboolean* pba = (env)->GetBooleanArrayElements(java_b_array,
0);
jsize len = (env)->GetArrayLength(java_b_array);
int i = 0;
for (i = 0; i < len; i++) {
__android_log_print(ANDROID_LOG_ERROR, "jnitag", "bArray
[%d] = %s",i, (pba[i] == JNI_TRUE)? "true":"false");
}
(env)->ReleaseBooleanArrayElements(java_b_array, pba, 0);
//处理int数组
jint *pia = (env)->GetIntArrayElements(java_i_array, 0);
len = (env)->GetArrayLength(java_i_array);
for (i = 0; i < len; i ++) {
__android_log_print(ANDROID_LOG_ERROR, "jnitag", "iArray
[%d] = %d", i,pia[i]);
}
(env)->ReleaseIntArrayElements(java_i_array, pia, 0);
//处理String数组
len = (env)->GetArrayLength(java_str_array);
for (i = 0; i < len; i++) {
3.3 JNI传参
50//由于String不是一个基本类型,而是一个实例对象类型
//所以调用GetObjectArrayElement
jstring jstrObj= (jstring)(env)->GetObjectArrayElement(ja
va_str_array, i);
__android_log_print(ANDROID_LOG_ERROR, "jnitag", "stringA
rray[%d] = %s",i, env->GetStringUTFChars(jstrObj,NULL));
}
//返回String 数组
jstring str;
jobjectArray strArray;
jsize arrayLen = 5;
const char * sa[] = {"hello", "JNI", "is", "so", "EASY!"};
//string不是一个基本数据类型,是一个复杂的类型,所以需要用newObjectA
rray,
//以下一句代码,表示该Object是一个String类型的数组
strArray = (env)->NewObjectArray(arrayLen,(env)->FindClass("
java/lang/String"),0);
for (i = 0; i < 5;i++) {
str = (env)->NewStringUTF(sa[i]);
(env)->SetObjectArrayElement(strArray, i, str);
}
return strArray;
}
(4) java测试调用
10 10-java中的String对象
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
public class MainActivity extends AppCompatActivity {
public Button btn;
public EditText editText_username;
public String logTag = "MainActivityDebug";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(logTag, "onCreate");
setContentView(R.layout.activity_main);
//关联变量和 UI控件
btn = (Button)findViewById(R.id.button);
editText_username = (EditText) findViewById(R.id.editTex
t_username);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String username = editText_username.getText().to
String();
Log.e(logTag, username);
}
});
}
2.2 Activity的生命周期
19@Override
protected void onStart() {
super.onStart();
Log.e(logTag, "onStart");
}
@Override
protected void onStop() {
super.onStop();
Log.e(logTag, "onStop");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(logTag, "onRestart");
}
@Override
protected void onPause() {
super.onPause();
Log.e(logTag, "onPause");
}
@Override
protected void onResume() {
super.onResume();
Log.e(logTag, "onResume");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(logTag, "onDestory");
}
11 11-java中的date
获取请求报文代码
#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#define myerror(__err) do{perror(__err);exit(0);}while(0)
int main(int argc, char* argv[])
{
int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = 0;
int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
if(ret < 0)
myerror("bind");
listen(fd, 5);
int newfd = accept(fd, NULL, NULL);
char buf[2048];
recv(newfd, buf, sizeof(buf), 0);
printf("%s\n", buf);
return 0;
}
获取应答报文代码
5.2.1 HTTP协议
112#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#define myerror(__err) do{perror(__err);exit(0);}while(0)
int main(int argc, char* argv[])
{
int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int ret = connect(fd, (struct sockaddr*)&addr, sizeof(addr))
;
if(ret < 0)
myerror("connect");
char buf[] = "GET / HTTP/1.1\n"
"Host: 127.0.0.1\n"
"Connection: keep-alive\n"
"Accept: text/html,application/xhtml+xml,application/xml
;q=0.9,image/webp,*/*;q=0.8\n"
"Upgrade-Insecure-Requests: 1\n"
"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36\n"
"Accept-Encoding: gzip, deflate, sdch\n"
"Accept-Language: zh-CN,zh;q=0.8\n\n";
send(fd, buf, sizeof(buf), 0);
char resp[4096];
recv(fd, resp, sizeof(resp), 0);
12 12-java中的finalize方法和垃圾回收器
5.2.2 URL
URL(统一资源定位符)
统一资源定位符可以理解为网络路径,当我们要获取本地文件信息时,需要文件路
径,当获取网络上的文件信息时,就需要网络路径了。这个路径也经常被称之为网
址。
典型的网址:
http://www.baidu.com
http://board.locoy.com/api.htm
http://127.0.0.1:8080
http://www.example.com:9001/cgi-bin/login.cgi?
username=user&password=passwd
URL不能无限长,但是各个服务器规定的最大长度不尽相同,从2K到几百K的
都有,只是需要大家了解即可。
URL分为协议,主机地址,端口,路径四部分组成,比如
http://www.example.com:9001/cgi-bin/login.cgi?
username=user&password=passwd
0:0
1:0
http
协议,这里也可以是ftp等
www.example.com
主机地址
9001
主机监听端口
/cgi-bin/login.cgi?
username=user&password=passwd
指定的资源路径,第一个/表示根目录,
这个根目录和Linux系统中学习的根目录
并不是一回事儿,是服务所指定的根目
录
URL规定有些特殊字符是需要转码的,为了避免转码,在实际工作中,使用
base64对URL的参数进行编码之后再传输,或者使用POST方法向服务器传递
数据。
5.2.2 URL
1155.2.2 URL
1165.2.3 HTTPS和OpenSSL
5.2.3 HTTPS和
OpenSSL
通过报文可以看到,HTTP在网络中的传输时明文的,如果有人截获了报文,那么
报文中的敏感数据很容易泄漏
HTTPS 加密快速理解
HTTPS规定了一些列的交互方式,来保证
13 13-java中的文件操作
14 14-java中的abstract关键字
15 15-java中的interface接口
16 16-java中import和package
package com.cpp.itcast.testapp;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
18import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
public class MainActivity extends AppCompatActivity {
public Button btn;
public EditText editText_username;
public String logTag = "MainActivityDebug";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(logTag, "onCreate");
setContentView(R.layout.activity_main);
//关联变量和 UI控件
btn = (Button)findViewById(R.id.button);
editText_username = (EditText) findViewById(R.id.editTex
t_username);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String username = editText_username.getText().to
String();
Log.e(logTag, username);
}
});
}
2.2 Activity的生命周期
19@Override
protected void onStart() {
super.onStart();
Log.e(logTag, "onStart");
}
@Override
protected void onStop() {
super.onStop();
Log.e(logTag, "onStop");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(logTag, "onRestart");
}
@Override
protected void onPause() {
super.onPause();
Log.e(logTag, "onPause");
}
@Override
protected void onResume() {
super.onResume();
Log.e(logTag, "onResume");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(logTag, "onDestory");
}
}
2.2 Activity的生命周期
202.2 Activity的生命周期
也可以尝试再创建另一个Activity,让MainActivity跟之相互叫唤,来跟中状态。
起名 Main2Activity 。
然后在MainActivity再添加一个Button按钮。实现两个节目的切换动作。