[안드로이드] You need to use a Theme.AppCompat theme (or descendant) with this activity.

 

AlertDialog.Builder를 사용할 때에 발생할 수 있는 에러입니다.

new AlertDialog.Builder(getApplicationContext())new AlertDialog.Builder(this) 로 바꾸시면 해결됩니다.

[안드로이드] SDK Validation ANDROID_SDK_HOME is set to the root of your SDK

 

안드로이드 스튜디오에서 다음과 같은 에러가 날 때가 있습니다.

SDK Validation
ANDROID_SDK_HOME is set to the root of your SDK: C:\Users\username\AppData\Local\Android\Sdk
This is the path of the preference folder expected by the Android tools.
It should NOT be set to the same as the root of your SDK.
Please set it to a different folder or do not set it at all.
If this is not set we default to: C:\Users\username

 

이것은 ANDROID_SDK_HOME 이라는 시스템 변수가 C:\Users\사용자명\AppData\Local\Android\Sdk 로 되어 있어서 나타나는 문제입니다. 이럴 때에는 제어판의 시스템 항목에 있는 환경 변수 목록에서 ANDROID_SDK_HOME 을 찾아서 지워주시면 문제가 해결됩니다. ANDROID_SDK_HOME 항목을 지워주시면 안드로이드 스튜디오가 알아서 자동으로 적당한 경로를 찾게 됩니다.

 

[안드로이드] 일정 시간동안 멈춘 후 작업하기 (postDelayed 사용)


안드로이드 개발을 하다 보면 몇 초 동안 기다린 후에 작업을 해야 할 경우가 있습니다. 일반 자바 프로그래밍에서라면 Thread.sleep(3000); 등을 사용하면 되겠지만 안드로이드에서는 앱이 그 시간동안 먹통이 되기 때문에 위와 같은 코드를 사용할 수 없습니다. 안드로이드에서는 다음과 같은 코드를 사용하면 됩니다.


new Handler().postDelayed(new Runnable() {

        @Override

        public void run() {

          someFunction(); // 일정 시간 기다린 후에 실행될 코드를 이곳에 씁니다.

        }

    }, 3000); // ms 단위라서 1000이 1초입니다.


( 참조한 사이트: https://stackoverflow.com/a/31041945/1125721 )

[안드로이드] 화면 녹화하기


개발자 옵션에서 USB 디버깅이 활성화되어 있는 상태라면 adb를 사용해서 쉽게 안드로이드 화면을 녹화할 수 있습니다.


adb shell screenrecord /sdcard/file_name.mp4

// 녹화를 끝낼 때에는 Ctrl + C


이렇게 하면 저장소에 file_name.mp4 라는 이름으로 녹화 파일이 저장됩니다.


( 참조한 곳: https://mytalkhome.tistory.com/610 , https://www.androidpub.com/2579669 )

[안드로이드] CMakeLists.txt 파일 설명


안드로이드에서 JNI를 통해 C나 C++ 코드를 사용하려면 CMake나 ndk-build중 하나를 사용해야 합니다. 이 글에서는 CMakeList.txt에 사용되는 여러 옵션에 대해 알아보겠습니다.


1. 사용할 CMake의 최소 버전 설정


cmake_minimum_required(VERSION 3.4.1)



2. 안드로이드에서 사용할 라이브러리의 이름과 공유 및 정적 여부, 소스 코드 경로 설정


아래 예제의 경우 라이브러리의 이름은 native-lib이고 공유 라이브러리이며 소스 코드 경로는 src/main/cpp/native-lib.cpp 입니다. 참고로 이렇게 컴파일을 하면 CMake는 컴파일 결과물을 libnative-lib.so 라는 이름으로 저장합니다.


add_library( native-lib

             SHARED

             src/main/cpp/native-lib.cpp )



3. 소스 코드에서 사용하는 헤더 파일이 들어있는 디렉토리 설정


설정해주지 않아도 동기화 이후에는 자동으로 헤더 파일이 인식되기는 합니다만, 설정해주면 컴파일 단계에서부터 연결된 헤더 파일을 볼 수 있습니다.


include_directories(src/main/cpp/include/)



4. 이미 존재하는 안드로이드 NDK 기본 라이브러리 사용하기


find_library()와 target_link_libraries()를 사용하면 안드로이드 NDK에서 기본으로 제공하는 라이브러리를 따로 컴파일할 필요 없이 바로 사용할 수 있습니다. 아래 예제는 NDK에 있는 log라는 라이브러리를 찾아서 log-lib이라는 변수명으로 저장한 뒤에 native-lib에서 불러와서 사용하는 코드입니다. log-lib이 변수명이기 때문에 target_link_libraries() 에서는 ${log-lib} 으로 표기됩니다.


find_library( log-lib

              log )

target_link_libraries( native-lib

                       ${log-lib} )



5. 소스 코드 형태로 존재하는 안드로이드 NDK 기본 라이브러리 사용하기


4번 경우와 유사한데 이 경우는 안드로이드 NDK 기본 라이브러리가 컴파일되지는 않고 소스 코드 형태로 존재한다는 점이 다릅니다. 사용법은 3번과 4번을 합친 형태입니다.


add_library( app-glue

             STATIC

             ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )


target_link_libraries( native-lib

                       app-glue

                       ${log-lib} )



6. 이미 컴파일 된 외부 라이브러리를 불러와서 사용하기 (매우 중요)


현업에서 안드로이드 개발을 하다 보면 다른 사람이 만든 라이브러리를 이미 컴파일 된 상태로 불러와서 사용해야 할 경우가 정말 많습니다. 이 경우는 add_library()와 set_target_properties()를 사용해야 합니다. add_library()에서는 이 라이브러리가 이미 컴파일 된 상태라는 것을 알려주기 위해 IMPORTED를 사용하고, set_target_properties()에서는 컴파일 된 파일의 경로를 지정해줍니다. 여러가지 CPU 구조를 지원하려면 ANDROID_ABI 변수를 사용하면 됩니다. 컴파일 단계에서 헤더 파일 정보를 보려면 include_directories()를 사용하면 되고, 외부 라이브러리를 불러온 뒤에는 target_link_libraries()를 사용해서 원하는 라이브러리에 연동시키면 됩니다.


아래는 libimported-lib.so 파일을 불러와서 imported-lib 이라는 변수에 저장한 뒤에 native-lib에서 imported-lib을 다른 라이브러리와 함께 사용하는 예제입니다. PROPERTIES IMPORTED_LOCATION는 IMPORTED_LOCATION이라는 값을 정해주겠다는 이야기입니다.


add_library( imported-lib

             SHARED

             IMPORTED )


set_target_properties( imported-lib

                       PROPERTIES IMPORTED_LOCATION

                       imported-lib/src/${ANDROID_ABI}/libimported-lib.so )


include_directories( imported-lib/include/ )


target_link_libraries( native-lib imported-lib app-glue ${log-lib} )



이 정도면 안드로이드에서 일반적으로 CMake를 사용하는 데에는 큰 문제가 없을 것입니다.

[안드로이드] Error:Could not find method jackOptions() for arguments


그래들 파일에서 아래 블록 부분을 지워준 뒤 안드로이드 스튜디오를 껐다가 다시 실행하면 문제가 해결됩니다. 


// 이 부분을 삭제하시면 됩니다.

jackOptions {

    enabled true

}


[안드로이드] No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android


안드로이드에서 사용되는 NDK 버전이 올라가면서 MIPS형 CPU에 대한 지원이 중단되었습니다. 그런데 build.gradle에 지정되어있는 gradle 버전이 낮으면 안드로이드 스튜디오가 MIPS에 대한 정보를 계속 찾으려고 하다가 위와 같은 에러를 내게 됩니다. 이럴 때에는 gradle 버전을 3.1.4 나 그 이상으로 설정해준 뒤 안드로이드 스튜디오를 껐다가 다시 실행하면 문제가 해결됩니다.


dependencies {

    classpath 'com.android.tools.build:gradle:3.1.4'

}



  1. ndk 없애! 2019.10.02 17:13

    ndk를 안쓰는 프로젝트에 ndk 경로가 잡혀있으면 저런 에러 나더라구요
    저는 sdk 폴더에서 ndk관련된것 다 삭제하고 해결했습니다 ^^

[안드로이드] no original dex files found for dex location


개발중이던 앱 소스 코드를 다른 컴퓨터로 옮기자 앱이 갑자기 안 돌아가서 조금 고생을 했습니다. 로그에는 java.io.IOException: No original dex files found for dex location 이 계속 찍히더라고요. 해결방법은 조금 엉뚱하게도 인스턴트 런 기능을 끄는 것이었습니다.


메뉴에서 차례대로 File -> Settings -> Build, Execution, Deployment -> Instant Run 을 찾아가셔서 Enable Instant Run to hot swap code/resource changes on deploy (default enabled) 라고 되어 있는 부분의 체크를 해제하시면 됩니다.


참조: https://stackoverflow.com/a/34784823/1125721

[안드로이드] undefined reference to `cv::imwrite(cv::String const&, cv::_InputArray const&, std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&)'


안드로이드에서 CMake를 사용해서 OpenCV를 사용한 JNI 함수를 만들다 보면 imwrite 부분이 컴파일이 안 되는 경우가 있습니다. 이 때에는 gradle 파일에 다음과 같이 arguments '-DANDROID_STL=gnustl_shared' 을 추가해 주면 됩니다.


android {

    // ...

    defaultConfig {

        // ...

        externalNativeBuild {

            cmake {

                arguments '-DANDROID_STL=gnustl_shared' // needed to enable imwrite                

            }

        }

    }

}


  1. 지나가던 개발자 2020.10.27 21:53

    안드로이드에서 더 이상 gnustl_shared를 지원해주지 않아서 사용할 수 없습니다.

    • 크롬망간 2020.10.27 22:04 신고

      안드로이드 새 버전에서 설정이 바뀌었나보네요 ㅠㅠ 새로운 정보 감사드립니다 ^^

[안드로이드] error: package R does not exist


error: package R does not exist 는 매니페스트 파일에 액티비티를 적어 주지 않았을 때에 발생합니다.

아래와 같은 식으로 AndroidManifest.xml 파일 안에 액티비티를 적어 주셔야 합니다.


<application>

    ...

    <activity android:name=".MyLovelyActivity"></activity>    

</application>


+ Recent posts