原本前面文章有寫如何簡化外部工具javah來產生jni需要的c語言header file,最近呼叫jni有需要傳入AssetManagrt,原本的參數沒有傳入java 的AssetManager classes的原型因此會遇到Error: Cannot determine signature for AssetManager的錯誤,這時候在之前寫的javah引用參數 "-v -jni -d $ModuleFileDir$\src\main\jni $FileClass$"小改一下,把sdk的使用版本內的android.jar給傳入就可以,改寫成"-v -jni -d $ModuleFileDir$\src\main\jni -classpath E:\AndroidSdk\platforms\android-16\android.jar;. $FileClass$",因為我專案設定的minisdk是16,所以我就用android-16的android.jar當成解讀java classes的參數填入,這樣設定好,跑一下設定的javah外部工具,這樣就會產生需要的jni c語言header file了。
目前分類:Android (15)
- Jul 16 Sat 2016 20:24
Error: Cannot determine signature for AssetManager
- Jun 30 Thu 2016 09:57
NDK無法使用c++11特性to_string函數的用法
在NDK中寫一些東西,剛好遇到要把int、long 轉成string,原本是要用c++11的函數 to_string來自動轉格式, 編譯參數也指定c++11了,但是NDK就是說找不到這個函數,問問google大神才發現NDK沒有實作出全部的c++11特性出來,網路上剛好有人寫了一個函數就拿來用 程式碼如下:
#include <string>
#include <sstream>
template <typename T>
std::string to_string(T value)
{
std::ostringstream os ;
os << value ;
return os.str() ;
}
int main()
{
std::string perfect = to_string(5) ;
}
資料來源:http://stackoverflow.com/questions/947621/how-do-i-convert-a-long-to-a-string-in-c
- Jun 16 Thu 2016 20:14
NDK裡__android_log_print參數uint64_t編譯告警問題
今天用到一個read去讀取eventfd,結果想看看內容,用__android_log_print要顯示出內容,發現內容值的型態是uint64_t,編譯出現了這樣的告警:
warning: format '%lld' expects argument of type 'long long int', but argument 5 has type 'uint64_t {aka long unsigned int}' [-Wformat=]
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
- Jun 15 Wed 2016 21:46
NDK編譯遇到error: 'SYS_clock_gettime' was not declared in this scope
因為需要用到不受NTP影響的抓取系統時間函數,因此呼叫syscall(SYS_clock_gettime, CLOCK_MONOTONIC_RAW, &ts);
結果遇到了error: 'SYS_clock_gettime' was not declared in this scope的編譯錯誤,查了一下NDK的版本原始碼,發現APP_PLATFORM := android-21可以正常呼叫,android-21以前的版本沒有SYS_clock_gettime的定義,查一下android-16的linux-syscalls.h內容,他是定義成__NR_clock_gettime,因為我的minSDK是android-16,所以就改成syscall(__NR_clock_gettime, CLOCK_MONOTONIC_RAW, &ts); 就可以編譯成功了,測試函數也正常。
- Jun 15 Wed 2016 15:22
NDK編譯發生fatal error: sys/eventfd.h: No such file or directory
因為C++方面用到eventfd,所以按慣例引入宣告檔#include <sys/eventfd.h>,沒想到NDK編譯出現fatal error: sys/eventfd.h: No such file or directory這樣的錯誤,查了一下,在Application.mk裡放一行編譯參數就可以了,參數如下:
APP_PLATFORM := android-16
實際要用哪個API Level要自己去測試,因為我的minSDK是設定16,所以這裡也用android-16,實際我測試用android-9和android-21事都能在NDK編譯成功。詳細的APP_PLATFORM說明請見:
- May 26 Thu 2016 13:46
Android Studio中Button的text都是大寫
- May 21 Sat 2016 17:36
android studio增加javap工具
進入android studio的External tools設定,然後按一下+號,然後填入Name、Description、Program、Parameters、Working directory等需要填入的值。
Name: 填入工具會顯示的名稱,"javap"還滿容易看懂.
Description: 填入說明
- May 18 Wed 2016 21:08
jstring 轉成char的方法
以下資料是做個紀錄
//C++ code extern "C" JNIEXPORT void JNICALL Java_ClassName_MethodName (JNIEnv *env, jobject obj, jstring javaString) { //Get the native string from javaString const char *nativeString = env->GetStringUTFChars(javaString, 0); //Do something with the nativeString //DON'T FORGET THIS LINE!!! env->ReleaseStringUTFChars(javaString, nativeString); }
/*C code*/ JNIEXPORT void JNICALL Java_ClassName_MethodName (JNIEnv *env, jobject obj, jstring javaString) { /*Get the native string from javaString*/ const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0); /*Do something with the nativeString*/ /*DON'T FORGET THIS LINE!!!*/ (*env)->ReleaseStringUTFChars(env, javaString, nativeString); }
- May 10 Tue 2016 09:10
ndk-build常用參數紀錄
NDK是一套用來實現APP執行原生碼(native-code)的工具,白話點講就是把c/c++的語法按參數和不同CPU編譯成二進制CPU碼.以下是遇到的參數說明.
NDK_LIBS_OUT: 指定編譯好的lib檔(.so)要放哪裡.範例: ndk-build NDK_LIBS_OUT=../jniLibs
NDK_OUT: 指定編譯過程的obj檔要放哪裡. 範例: ndk-build NDK_OUT=./obj
- Apr 29 Fri 2016 15:30
minSdkVersion,targetSdkVersion,target說明
1.檔案AndroidManifest.xml
<uses-sdk android:minSdkVersion="19" />
<uses-sdk android:targetSdkVersion="23" />
- Jul 27 Mon 2015 19:25
Ubuntu 14.04.2 LTS 64bit安裝Android Studio問題紀錄
系統: Ubuntu 14.04.2 LTS 64bit
當出現以下訊息表示缺少一些套件:
unable to run mksdcard sdk tool. ubuntu android studio
- Mar 02 Mon 2015 20:59
Android Studio裡自定Android.mk和Application.mk
在Android Studio裡自定Android.mk和Application.mk內容來完成編譯NDK
首先要先建立兩個外部工具,好方便我們編譯的時候使用。
- 建立javah工具:
啟動Android Studio,然後在無開啟任何專案的情況下點選畫面中的Configure,如下圖紅框。
- Jan 08 Thu 2015 15:03
如何在Android Studio裡跑NDK
如何在Android Studio裡跑NDK
我的開發環境在Windows 7 64bit,首先你要安裝好Android Studio和NDK,NDK的部分是下載解開壓縮檔,它會產生一個帶有NDK版號的目錄,你要將目錄名稱改為NDK比較好。參考Google的NDK說明就有講,更多詳細說明請自行至NDK開發網站看。
安裝好Android Studio和NDK之後,開啟Android Studio新建一個專案,我這裡是寫一個簡單用C輸出字串給JAVA的範例,網路上好像也很多了。新建專案如下圖:
- Jan 04 Sun 2015 16:35
Android Studio引入Volley
Android Studio引入Volley
詳細的Volley可以在https://github.com/mcxiaoke/android-volley查看,我在這裡只有簡略說明,我是用JAR的方式引入library。
- Jan 03 Sat 2015 14:05
Android Studio變更 skin來顯示Hardware Keyboard