Android Studio NDK-fprintf()格式字符

Android Studio NDK-fprintf()格式字符
Android Studio NDK-fprintf()格式字符

係NDK調用fprintf ()格式字符函式報錯

fprintf(fp_error,buffer);
error: format string is not a string literal (potentially insecure) [-Werror,-Wformat-security]

原解fprintf()缺失參數.加入參數0問題消失.

fprintf(fp_error,buffer,0);

 

int printf(const char *format [,argument]…); 熒屏
int fprintf(FILE *stream,const char *format [,argument ]…); 文檔
int sprintf(char *buffer,const char *format [,argument] …); 記憶體

 

format格式 argument參數 簡介
c 字符 單個字符
C 字符 單個字符
d 整數 帶正負符號十進整數
i 整數 帶正負符號十進整數
o 整數 冇正負符號八進整數
u 整數 冇正負符號十進整數
x 整數 冇正負符號,細寫十六進整數.abcdef
X 整數 冇正負符號,大寫十六進整數.ABCDEF
e 浮點數 帶正負符號十進浮點數,指數版.
E 浮點數 帶正負符號十進浮點數, 指數版.
f 浮點數 帶正負符號十進浮點數
F 浮點數 帶正負符號十進浮點數
g 浮點數 係%e同%f中選
G 浮點數 係%e同%f中選
a
A
n
s 字符串 直至首個NULL
S 字符串 直至首個NULL
z
% 指定格式

 

樣式 輸出/寫入
sprintf (text, ” %2d\n”,  3); 03
sprintf (text, “%s\n “, “abcdef”); abcdef

 

Android Studio NDK 日期時間

Android Studio NDK 日期時間
Android Studio NDK 日期時間

Android 所用C/C++庫Bionic API. 即輕量級C/C++庫. 分32位同64位, 32位『time_t』有效期至2038年, 64位『__time64_t』有效期至3000年.

呌『tm』時間結構

struct tm { 結構時間
int tm_sec; 秒鐘[0~59]
int tm_min; 分鐘[0~59]
int tm_hour; 時鐘[0~23]
int tm_mday; 號[1~31]
int tm_mon; 月份[0~11] 需加1
int tm_year; 年份需加1900, 儒略歴
int tm_wday; 禮拜[0~1],禮拜日Sunday=0
int tm_yday; 天[0~365],1月1號=0
int tm_isdst; 夏令時為正, 否
long int tm_gmtoff; 當前時相對UTC往東時差,即東爲正西爲負.
const char* tm_zone;}; 時區縮寫

係『Win32 API』你需time()/_time64()獲得時間, 再蒞localtime()/_localtime64()根據時區轉爲本地時間『tm』

Win32  API版本
char time_text[280];

struct tm   temp_str;// 時間結构

__time64_t  temp_int;// 時間整数

_time64(&temp_int);// 获取時間

_localtime64_s(&temp_str ,&temp_int);// 根据時區轉為本地時間

sprintf(time_text, “%4d-%02d-%02d %02d:%02d:%02d”,

1900+temp_str.tm_year,1+temp_str.tm_mon, temp_str.tm_mday,

temp_str.tm_hour,temp_str.tm_min,temp_str.tm_sec);

2021-09-09 23:43:08

Android Studio NDK 『Bionic API』版本,可用localtime_r()根據時區獲得本地時間『tm』

Bionic API版本
    char time_text[280];// 時間文本

struct tm  temp_str;// 時間結構

time_t temp_int;// 32位時間整數

temp_int = time(0);

localtime_r(&temp_int,&temp_str);// 根據時區轉爲本地時間

sprintf(time_text, “%04d-%02d-%02d %02d:%02d:%02d”,

1900+temp_str.tm_year,1+temp_str.tm_mon, temp_str.tm_mday,

temp_str.tm_hour,temp_str.tm_min,temp_str.tm_sec);

2021-09-09 23:43:08

 

 

 

Android Studio NDK編譯錯誤 error undefined reference

Android Studio NDK編譯錯誤 error undefined reference
Android Studio NDK編譯錯誤 error undefined reference

新版Android Studio用CMake編譯so庫. 構建『Native C++』工程已自動生成『CMakeLists.txt』同『native-lib.cpp』, 但C/C++代碼係『native-lib.cpp』調用其它『.cpp』程式皆報錯『error: undefined reference』, 皆因冇將C/C++代碼編譯入so庫.

D:/Android/GeomanticCompass/app/src/main/cpp/native-lib.cpp:14: error: undefined reference to ‘IsEven(int)’

睇『CMakeLists.txt』文檔

係『add_library()』尾加入『math.cpp』生成鏈接文檔

add_library( geomanticcompass

SHARED

native-lib.cpp

math.cpp)

查找日志庫

find_library(log-lib        log)  

將目標文檔與庫文檔進行鏈接

target_link_libraries(geomanticcompass        math        ${log-lib})

 

 

Android Studio缺失插件 missing essential plugin

Android Studio缺失插件 missing essential plugin
Android Studio缺失插件 missing essential plugin

Android Studio崩潰後重啟弹出『missing essential plugin』缺必須插件,重装Android Studio問題依舊. 缺失插件可能插件崩潰被屏蔽. 係C: 盘搜索 『disabled_plugins.txt』将入面內容冚辦爛刪.

missing essential plugin

org.jietbrains.android

Please reinstall Android Studio from scratch

 

C:\Users\bookc\AppData\Roaming\Google\AndroidStudio2020.3\disabled_plugins.txt

 

Android程式入口Application

Android程式入口Application
Android程式入口Application

Android唔似Window有Winmain()/main()作程式入口. 而Android用Application作程式入口. 比Activity更早調用,也唔會因方向改變重複調用onCreate().

將Application.onCreate()當main()用. 將程式『初此』Init()冚辦爛摆何係度.

 

  1. 生永MainApplication继承Application 覆盖onCreate()
class MainApplication extends Application
  1. 配置『xml』
<application android:name=”.MainApplication” ></application>
  1. 係onCreate()『初此』Init()程式

 

public class MainApplication extends Application {

// 全局变量,应用程序句柄

private static MainApplication singleton;

//返回应用程序实例

public static MainApplication getInstance() {

return singleton;

}

//创建应用程序时调用

@Override

public final void onCreate(){

Context context;

singleton = this;//

super.onCreate();

context = this.getApplicationContext();

// 初此

}

// 記憶體低

@Override

public final void onLowMemory() {

super.onLowMemory();

}

// 释放憶體低

@Override

public final void onTrimMemory(int level) {

super.onTrimMemory(level);

}

// 改变配置时调用

@Override

public final void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

}

}

Android Studio C/ C++編程-使用NDK

Android Studio C/ C++編程-使用NDK
Android Studio C/ C++編程-使用NDK

Android Studio C/ C++編程開發环境由以下組件构成:

  1. 装『Android Studio
  2. Android SDK(Software Development Kit) 軟件開發包, Android Studio 己含
  3. Android NDK(Native Development Kit) 原生開發包, Android Studio 己含
  4. Java JDK(Java Development Kit) Android Studio 己包含Java開發包.
  5. CMake构建工具,编译原生库
  6. LLDB調試工具,调试原生代码
  7. 生成C/C++項目
  8. 係『native-lib.cpp』下生成C函式

 

Android Studio安装『NDK』同『CMake』

  1. 撳『Tools』 -> 『SDK Manager』
  2. 撳『Appearance & Behavior』-> 『System Settings』->『Android SDK』
  3. 撳『SDK Tools』
  4. 勾『NDK(Side by side)』
  5. 勾『CMake』
  6. 撳『Apply』下載

 

生成C/C++工程

  1. 啟用Android Studio
  2. 撳『Projects』->『New Project』
  3. 『Templates』撳『Phone and Tablet』手機同平板
  4. 撳『Native C++』
  5. 『Name』指『程式名』填『經倫羅盤/Geomantic Compass』
  6. 『Package name』指『包名』,將网站『域名』倒置加『.程式名』『domain.name』 确保唯壹性,如『net.bookcard.GeomanticCompass』
  7. 『Language』指編程言, 默認『Kotlin』選『Java』.
  8. 『Save location』指工程存檔路徑,只可係ASCII碼,如『D:\Android\GeomanticCompass』
  9. 『Minimum SDK』允許運行Android平臺, 選最細SDK版本,获得盡量多設备支持.
  10. 『Use legacy android support libraries』用旧版android支持库.
  11. 撳『Next』
  12. 『C++ Standard』选择C++ 标准,默認『Toolchain Default』用『 CMake』 设置.
  13. 撳『Finish』自動构建C/ C++工程

 

係『native-lib.cpp』下生成C函式

native-lib.cpp
extern “C” JNIEXPORT jstring JNICALL

Java_net_bookcard_geomanticcompass_Lib_stringFromJNI(

JNIEnv* env,

jobject /* this */) {

std::string hello = “Hello from C++”;

return env->NewStringUTF(hello.c_str());

}

  1. 『extern “C”』声明C程式
  2. 『JNIEXPORT』
  3. 『jstring』程式返回類型
  4. 『JNICALL』参数压桟順序
  5. 函式名以『文檔夾路徑』組成,『Java_package_function』區分大細寫.
  6. 函式『Java』開頭, 因位於『Java』根文檔夾
  7. 函式『net_bookcard_geomanticcompass』包名文檔夾
  8. 函式『Lib』指java 文件Lib calss
  9. 函式『stringFromJNI』指函式名
  10. 参數『JNIEnv* env』調用Java函式
  11. 『jobject』
  12. 最後先係函式参數

 

真機調試Android程式

  1. 手機用USB線同电脑相連
  2. 『Build』->『Make Projects』生成工程
  3. 『Run』->『Debug ‘app’』 調試工程

 

 

 

 

配置『系統變數』

  1. 撳『Win+Pause Break』
  2. 撳『變更設定』開啟『系統內容』
  3. 撳『進階』->『環境變數』
  4. 『系統變數』->『新增』
  5. 『變數名稱』
  6. 『變數值』

 

装Android NDK

  1. 撳『File』-> 『Project Structure』或『Ctrl+Alt+Shift+S』
  2. 撳『SDK Location』
  3. 『Android NDK location』撳『Download』下載『Android NDK』
  4. 『Android NDK location』『C:\Users\user\AppData\Local\Android\Sdk\ndk\23.0.7599858』

 

Android Studio默認安装Android SDK

  1. 撳『File』->『New Project Settings』->『Project Structure』
  2. 撳『SDK Location』
  3. 『Android SDK location』『C:\Users\user\AppData\Local\Android\Sdk』

 

Android Studio默認安装Java JDK

  1. 撳『File』->『Project Structure』
  2. 撳『SDK Location』
  3. 『JDK Location』 『C:\Program Files\Android\Android Studio\jre』
  4. 設定『環境變數』

 

 

验証『Java JDK』安装

  1. 開啟命令輸入模式『EXE』
  2. 輸入『java -version』执行
  3. 安装成功則显示JDK版本号

Android Studio設定字體尺碼

Android Studio設定字體尺碼
Android Studio設定字體尺碼

Android Studio默認字體細睇代碼耗神, 而Android Studio唔支持滑輪字體尺碼. 你需要手動設定.

Android Studio設定字體尺碼

  1. 撳『File』->『Settings』或者撳『Ctrl+Alt+S』啟動『Settings』
  2. 撳『Edit』->『Font』
  3. 設定『Size』值默認12, 放大壹倍設
  4. 撳『Apply』应用設定.

Android禁程式頻繁调用onCreate

Android禁程式頻繁调用onCreate
Android禁程式頻繁调用onCreate

Android手機『方向切换』『滑出鍵盘』, Android會認為配置改變, 将销毁并重啟程式. 調用activity:onCreate()會大量占用CPU時間. 係游戲造成500ms以上都唔可接受. 編輯『AndroidManifest.xml』係『<activity>』元素『configChanges』属加入『orientation方向切换』同『keyboardHidden滑出鍵盘』『keyboard插入键盘』. 係MainActivity重载onConfigurationChanged ()自己處理, 達置 『方向切换』『滑出鍵盘』冇需再次调周onCreate().

AndroidManifest.xml
<activity

android:name=”.MainActivity”

android:configChanges=”keyboard|keyboardHidden|orientation”>

</activity>

 

MainActivity
    @Override

public void onConfigurationChanged(Configuration newConfig) {

if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {// 横向

}

else

if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {// 纵向

}

if(newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO )    {//  显示键盘

}

super.onConfigurationChanged(newConfig);

}

 

Android程式强制安装SD卡

Android程式强制安装SD卡
Android程式强制安装SD卡

Android程式默認装係内部存储,因佢有极快讀寫速度, 係Android2.2 後可强制装係SD卡, 但SD讀寫慢, 可能會影响程式表現. 編輯AndroidManifest.xml係manifest添installLocation属. 預設装係外部存储 preferExternal.

AndroidManifest.xml
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”

package=”net.bookcard.GeomanticCompass”

android:installLocation=”preferExternal”>

</manifest>

 

Android Studio安装指南

Android Studio安装指南
Android Studio安装指南
初建Android 工程Hello World
初建Android 工程Hello World
真機調試Android程式
真機調試Android程式

装Android Studio可簡化搭建開發环境過程. 且集成『Open JDK』同『Android SDK』

Android Studio安装指南

  1. 下載android Studio『https://developer.android.com/studio』『android-studio-2020.3.1.24-windows.exe
  2. Android Studio 安装路径『C:\Program Files\Android\Android Studio』
  3. 『Install Type』勾『Custom』自定.
  4. 自Android Studio2.2已集成『Open JDK』,『Select Default JDK Location』安装檔案夾『C:\Program Files\Android\Android Studio\jre』
  5. 界面主题『Select UI Theme』有Darcula同Light揀. 白底黑字更適宜睇文本
  6. 『SDK Components Setup』勾『Android SDK』『API:Android 』
  7. 『Downloading Components』安装完成.

 

SDK Manager装Android SDK 組件

  1. 啟動『Android Studio』
  2. 『Settings for New Projects』
  3. 『Appearance & Behavior->System Settings->Android SDK->SDK Tools』

 

初建Android 工程Hello World

  1. 啟動『Android Studio』
  2. 撳『Projects->New Project』
  3. 撳『Phone and Tablet』手機同平板
  4. 『模板』撳『Empty Activity』.
  5. 『Name』指『程式名』填『風水羅盤』
  6. 『Package name』指『包名』,將网站『域名』倒置加『.程式名』『domain.name』 确保唯壹性,如『net.bookcard.GeomanticCompass』
  7. 『Language』指編程言, 默認『Kotlin』選『Java』.
  8. 『Save location』指工程存檔路徑,只可係ASCII碼,如『D:\Android\GeomanticCompass』
  9. 『Minimum SDK』允許運行Android平臺, 選最細SDK版本,获得越多運行設备支持.
  10. 『Use legacy android support libraries』用旧版android支持库.
  11. 撳『Finish』

 

激活手機/平板開發模式

  1. 撳『設定』->『我的裝置』->『全部参數』.
  2. 連續撳『版本』, 直至提示进入『開發人員模式』.
  3. 撳『設定』->『更多設定』->『開發者選項』.
  4. 激活『開啟開發人員選項』
  5. 激活『USB調試』
  6. 激活『USB安装』
  7. 激活『USB調試(安全設定)』

 

真機調試Android程式

  1. 手機用USB線同电脑相連
  2. 『Run』->『Debug ‘app’』