android2018. 6. 21. 11:03
Custom Android Keycode를 추가하기 위한 예로 CUSTOM_MENU을 추가한다 가정하면 아래와 같이 수정한다. ./native/include/input/InputEventLabels.h:327:
DEFINE_KEYCODE(CUSTOM_MENU),

./native/include/android/keycodes.h:772:
AKEYCODE_CUSTOM_MENU = 123123

./base/core/res/res/values/attrs.xml:1892:


./base/core/java/android/view/KeyEvent.java:813:
/** Key code constant: custom menu

 * @hide */

public static final int KEYCODE_CUSTOM_MENU = 123123;

참고로 공식적으로 API를 원하지 않는 경우 KeyEvent.java에서 @hide를 명시하지 않을 경우 빌드 시, error가 발생하므로 이에 주의한다. 만일 key를 공식으로 사용하려면 clean build 후 make update-api를 실행하면 doc을 업데이트하며 다음 platform 빌드 시 발생하는 문제를 회피할 수 있다.

Posted by easy16
android2018. 6. 19. 12:00


system app으로 사용하기 위해 다음과 같이 path를 변경함.


app/build.gradle


sourceSets {

main{

// let gradle pack the shared library into apk

//jniLibs.srcDirs = ['src/main/cpp/libtest']

jniLibs.srcDirs = ['src/libs']

}

}




"app/src/main/cpp/CMakeLists.txt"


cmake_minimum_required(VERSION 3.4.1)


#빌드된 library가 생성 될 경로를 지정


set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/../../../libs/")

add_library(test_jni SHARED IMPORTED)



set_target_properties(

test_jni



PROPERTIES IMPORTED_LOCATION



${CMAKE_SOURCE_DIR}/../../../libs//libtest/${ANDROID_ABI}/libtest_jni.so )



#include_directories(${CMAKE_SOURCE_DIR}/libtest/include/)

include_directories(${CMAKE_SOURCE_DIR}/../../../libs/libtest/include/)



find_library( # Sets the name of the path variable.

log-lib



# Specifies the name of the NDK library that

# you want CMake to locate.

log )



target_link_libraries(

native-lib



test_jni



${log-lib} )

   




해당 앱에서만 so file을 사용하기 위해 Android.mk를 수정, LOCAL_PREBUILT_JNI_LIBS_arm 변수 library path를 지정한다.


   

LOCAL_PREBUILT_JNI_LIBS_arm := app/libs/libnative-lib.so \

app/libs/libtest/armeabi-v7a/libtest_jni.so



빌드 결과 확인 


./priv-app/NDKSample/lib/arm/libtest_jni.so

./priv-app/NDKSample/lib/arm/libnative-lib.so



참조:

https://stackoverflow.com/questions/3742090/custom-directory-for-cmake-library-output

https://developer.android.com/ndk/guides/cmake

Posted by easy16
android2018. 6. 19. 10:43

System app에서 so file을 로딩하기 위한 방법으로 아래와 같이 library를 추가해 준다.

차이는 아래와 같이 LOCAL_JNI_SHARED_LIBRARIES를 사용할 경우 system/lib 경로에 so 가 복사된다.


LOCAL_JNI_SHARED_LIBRARIES := libbluetooth_jni


out/target/product/project/system$ find . -name "libbluetooth_jni.so"

./lib/libbluetooth_jni.so

./app/Bluetooth/lib/arm/libbluetooth_jni.so



 LOCAL_PREBUILT_JNI_LIBS_arm := libs/armeabi-v7a/libAesJni.so

system$ find . -name "libAesJni.so"

./priv-app/RemoteVoiceInput/lib/arm/libAesJni.so



Posted by easy16
android2018. 6. 18. 18:52




NDK app을 system/app or system/priv-app 에 추가하여 system app으로 구동시킬 때

예상과 달리 LoadLibrary에 실패하였다.



테스트 해보진 않았으나, so file을 따로 미리정해진 path인 nativeLibraryDirectories 경로에 위치시켜야 하는 것으로 보인다.



/system/priv-app/NDKSample/lib/arm

/system/lib

/vendor/lib

/system/lib

/vendor/lib



06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/priv-app/NDKSample/NDKSample.apk"],nativeLibraryDirectories=[/system/priv-app/NDKSample/lib/arm, /system/lib, /vendor/lib, /system/lib, /vendor/lib]]] couldn't find "libnative-lib.so"

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at java.lang.Runtime.loadLibrary0(Runtime.java:1011)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at java.lang.System.loadLibrary(System.java:1657)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at simplendk.android.com.ndksample.MainActivity.<clinit>(MainActivity.java:17)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at java.lang.Class.newInstance(Native Method)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at android.app.Instrumentation.newActivity(Instrumentation.java:1173)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2708)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at android.app.ActivityThread.-wrap11(Unknown Source:0)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at android.os.Handler.dispatchMessage(Handler.java:105)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at android.os.Looper.loop(Looper.java:164)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at android.app.ActivityThread.main(ActivityThread.java:6541)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at java.lang.reflect.Method.invoke(Native Method)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)

06-18 18:16:48.708  6826  7451 D TchAnalyticsSvc:       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

06-18 18:16:48.783  3778  5349 I ActivityManager: Process simplendk.android.com.ndksample (pid 7427) has died: vis  +99TOP 




해당 topic으로 구글링해보니 유사한 언급을 하는 것으로 보인다.


https://groups.google.com/forum/#!topic/android-ndk/X1mRZwBxZLc


The .so's for apps placed in /system/app by the rom author or 
update.zip should be included in /system/lib by the rom author or 
update.zip 

Posted by easy16
android2018. 6. 18. 16:56

Android studio를 업그레이드 하면 gradle 버전이 올라 platform 빌드에 밀어 넣을 경우 sdk 버전이 맞지 않는 현상이 생김. 그럴 경우 아래와 같이 build-tool을 업데이트 해준다.


1. sdkmanager를 아래와 같이 실행

/opt/android-sdk-linux/tools/bin$ ls

apkanalyzer  avdmanager  lint          screenshot2  uiautomatorviewer

archquery    jobb        monkeyrunner  sdkmanager


./sdkmanager --update



2. 결과 확인

#/opt/android-sdk-linux/build-tools$ ls

23.0.0  24.0.0  24.0.2  24.0.3  25.0.0  25.0.3  26.0.0  27.0.0  27.0.3




Posted by easy16
android2018. 6. 18. 15:22

Gradle을 포함한 app 빌드를 위한 Android.mk 에제


#app/build.gradle
LOCAL_PATH := $(call my-dir)
TEST_JNI_TOP := $(LOCAL_PATH)

$(info $(shell cd $(TEST_JNI_TOP) &&./gradlew assembleRelease))

include $(CLEAR_VARS)
LOCAL_MODULE :=TestJNI
LOCAL_MODULE_CLASS := APPS
#LOCAL_SRC_FILES := app/build/outputs/apk/release/app-release-unsigned.apk
LOCAL_SRC_FILES := app/build/outputs/apk/release/TestJNI.apk
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
#local.properties
sdk.dir=/opt/android-sdk-linux/
ndk.dir=/opt/android-ndk-r15c/

LOCAL_PRIVILEGED_MODULE true 때문에 apk는 아래의 경로에 생성 된다.

[100% 1/1] Install: out/target/product/~~/system/priv-app/TestJNI/TestJNI.apk

'android' 카테고리의 다른 글

[NDK] so 포함한 apk가 so loading 실패 (2)  (0) 2018.06.19
[NDK] so 포함한 apk가 so loading 실패  (0) 2018.06.18
android sdk build tool update 방법  (0) 2018.06.18
apk name 변경하기  (0) 2018.06.18
[JNI]add prebuilt shared library  (0) 2018.06.14
Posted by easy16
android2018. 6. 18. 15:18


#1 app/build.gradle을 아래와 같이 수정

android {
//APK 이름 명시적으로 변경하기
def APP_NAME = "Text Animation"

compileSdkVersion 26

defaultConfig {
applicationId "com.overface.learningandroid"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

//APK 이름 명시적으로 변경하기
archivesBaseName = APP_NAME
}
}

#2


buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

/**
* variant.name : release, debug build variants 에 설정된 target
* variant.versionName : defaultConfig 에 정의된 versionName
*/
applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = APP_NAME + "${variant.name}-${variant.versionName}.apk"
}
}
}
}

출처 :

http://overface.tistory.com/196

Posted by easy16
android2018. 6. 14. 09:53


1. library 추가시, 아래와 같이 armeabi-v7a로 구성하지 않으면 apk 빌드시 포함되지 않으므로 반드시 추가해 줄 것.

(ndk build시 arch 구분없이 모두 포함하도록 구성하는게 나을듯)




2. 각자 환경에 맞도록 빨간색으로 된 부분을 추가.


app gradle


apply plugin: 'com.android.application'

android {
compileSdkVersion 27
defaultConfig {
applicationId "simplendk.android.com.ndksample"
minSdkVersion 25
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
ndk{
abiFilters 'armeabi-v7a'
}

}
sourceSets {
main{
// let gradle pack the shared library into apk
jniLibs.srcDirs = ['src/main/cpp/libtest']
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}

}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.1'
implementation 'com.android.support:design:27.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}


3. CMakeLists.txt 수정



cmake_minimum_required(VERSION 3.4.1)


add_library(
native-lib

SHARED

native-lib.cpp )


add_library(test_jni SHARED IMPORTED)

set_target_properties(
test_jni

PROPERTIES IMPORTED_LOCATION

${CMAKE_SOURCE_DIR}/libtest/${ANDROID_ABI}/libtest_jni.so )

#include_directories(${CMAKE_SOURCE_DIR}/libtest/include/)
include_directories(${CMAKE_SOURCE_DIR}/libtest/include/)

find_library( # Sets the name of the path variable.
log-lib

# Specifies the name of the NDK library that
# you want CMake to locate.
log )

target_link_libraries(
native-lib

test_jni

${log-lib} )





하기 링크 참조


https://developer.android.com/studio/projects/add-native-code?hl=ko#create-cmake-script

https://proandroiddev.com/android-ndk-how-to-integrate-pre-built-libraries-in-case-of-the-ffmpeg-7ff24551a0f  





Posted by easy16