目前分類:Android (15)

瀏覽方式: 標題列表 簡短摘要

原本前面文章有寫如何簡化外部工具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了。


文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

在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

 

文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

今天用到一個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__)

文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

因為需要用到不受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); 就可以編譯成功了,測試函數也正常。


文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

因為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說明請見: 

文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

在Button的XML宣告中增加:

android:textAllCaps="false"

就不會自動變大寫了。

文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

進入android studio的External tools設定,然後按一下+號,然後填入Name、Description、Program、Parameters、Working directory等需要填入的值。

Name: 填入工具會顯示的名稱,"javap"還滿容易看懂.

Description: 填入說明

文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

以下資料是做個紀錄

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

 

文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

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

文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

1.檔案AndroidManifest.xml

<uses-sdk android:minSdkVersion="19" />
<uses-sdk android:targetSdkVersion="23" />

文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

系統: Ubuntu 14.04.2 LTS 64bit

當出現以下訊息表示缺少一些套件:
unable to run mksdcard sdk tool. ubuntu android studio

文章標籤

大衛的記事 發表在 痞客邦 留言(0) 人氣()

Android Studio裡自定Android.mkApplication.mk內容來完成編譯NDK

首先要先建立兩個外部工具,好方便我們編譯的時候使用。

  • 建立javah工具:

啟動Android Studio,然後在無開啟任何專案的情況下點選畫面中的Configure,如下圖紅框。

大衛的記事 發表在 痞客邦 留言(4) 人氣()

如何在Android Studio裡跑NDK

我的開發環境在Windows 7 64bit,首先你要安裝好Android Studio和NDK,NDK的部分是下載解開壓縮檔,它會產生一個帶有NDK版號的目錄,你要將目錄名稱改為NDK比較好。參考Google的NDK說明就有講,更多詳細說明請自行至NDK開發網站看。

安裝好Android Studio和NDK之後,開啟Android Studio新建一個專案,我這裡是寫一個簡單用C輸出字串給JAVA的範例,網路上好像也很多了。新建專案如下圖:

大衛的記事 發表在 痞客邦 留言(6) 人氣()

Android Studio引入Volley

詳細的Volley可以在https://github.com/mcxiaoke/android-volley查看,我在這裡只有簡略說明,我是用JAR的方式引入library。

 

大衛的記事 發表在 痞客邦 留言(0) 人氣()

Android Studio如何選用SDK內建的skin來顯示出硬體鍵盤(Hardware Keyboard)如下圖紅框部分:

androidSkin  

 

大衛的記事 發表在 痞客邦 留言(0) 人氣()