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
linux2018. 6. 19. 10:17


Makefile을 쉽게 이해하기 위해 내장함수를 많이 알아 둘 필요가 있다.

간단히 몇가지만 정리하면 아래와 같다.



comma:= ,

empty:=

space:= $(empty) $(empty)

foo:= a b c

bar:= $(subst $(space),$(comma),$(foo))

# bar is now `a,b,c'.

여기서 subst 함수는 foo의 값 전체에서 각 스페이스를 콤머로 변경하고 그 결과를 이 값에 대입한다




$(patsubst pattern,replacement,text)

text 안에서 공백문자로 분리된 단어들 중 pattern와 매치되는 단어를 찾아서 그것들을 replacement로 변경한다.

(patsubst %.c,%.o,x.c.c bar.c)


$(var:suffix=replacement) == $(patsubst %suffix,%replacement,$(var))

ex)

objects = foo.o bar.o baz.o

이에 대응하는 소스 파일들의 리스트를 얻기 위해서 다음과 같이 쉽게 작성할 수 있다:

$(objects:.o=.c)


동일한 표현

$(patsubst %.o,%.c,$(objects))



$(strip string)

이 함수는 string의 앞뒤에 있는 공백문자들을 제거하고 내부에 있는 하나 이상의 공백문자들을 단일 스페이스로 교체한다. 그래서 `$(strip a b c )'의 결과는 `a b c'가 된다. 

strip 함수는 조건과 함께 사용될 때 아주 유용함.


.PHONY: all

ifneq   "$(needs_made)" ""

all: $(needs_made)

else

all:;@echo 'Nothing to make!'

endif

ifneq 지시어에서 변수 참조 `$(needs_made)' 를 함수 호출 `$(strip $(needs_made))' 로 바꿈으로써 robust하게 만들 것이다.


$(findstring find,in)

이 함수는 in에서 find를 찾는다. 있다면 그 값은 find가 된다; 그렇지 않다면 그 값은 빈 것이 된다. 이 함수를 조건에서 사용해서 주어진 문자열 안에서 특정 문자열의 존재 여부를 검사할 수 있다. 


ex)

$(findstring a,a b c)

$(findstring a,b c)

`a'와 `' (빈 문자열) 각각을 만든다. 



$(filter pattern...,text)

이 함수는 pattern 단어들 중의 임의의 것과 일치하지 않는 text 내의 공백문자로 분리된 단어들을 모두 제거하고 일치하는 단어들만을 리턴한다.

ex)

sources := foo.c bar.c baz.s ugh.h

foo: $(sources)

        cc $(filter %.c %.s,$(sources)) -o foo


$(filter-out pattern...,text)

이 함수는 text에서 pattern 단어들과 일치하는, 공백문자들로 분리된 단어들을 모두 제거하고 일치하지 않는 단어들만을 리턴한다. filter의 반대이다. 

ex)

objects=main1.o foo.o main2.o bar.o

mains=main1.o main2.o

다음은 `mains'에 있지 않는 오브젝트 파일들 모두를 담고 있는 리스트를 생성한다:

$(filter-out $(mains),$(objects))

$(dir names...)

이것은 names에 있는 각 파일 이름에서 디렉토리-파트를 추출한다. 파일 이름의 디렉토리-파트는 그 안에 있는 마지막 슬래쉬까지의 (그리고 이 마지막 슬래쉬를 포함한) 모든 것이다. 그 파일 이름이 슬래쉬가 없으면 디렉토리 파트는 문자열 `./'가 된다.

ex)

$(dir src/foo.c hacks)는 `src/ ./'라는 결과를 만든다.


$(notdir names...)

이 함수는 names에 있는 각 파일 이름의 디렉토리-부분을 제외한 모든 것을 추출한다. 파일 이름에 슬래쉬가 없으면 변화되지 않는다. 그렇지 않는 경우 마지막 슬래쉬까지 모든 것이 그것으로부터 제거된다.

ex)

$(notdir src/foo.c hacks)는 `foo.c hacks'라는 결과를 만든다.



$(suffix names...)

파일 이름이 소숫점(period)를 갖고 있다면 접미사는 마지막 소숫점부터 시작한 모든 것이다

ex)

$(suffix src/foo.c src-1.0/bar.c hacks) 는 `.c .c'라는 결과를 만든다.


$(basename names...)

이 함수는 names에 있는 각 파일 이름의 접미사를 제외한 모든 것을 추출한다. 

ex)

$(basename src/foo.c src-1.0/bar hacks) 는 `src/foo src-1.0/bar hacks' 라는 결과를 만든다.


$(addsuffix suffix,names...)

suffix의 값은 각 개별 이름의 끝에 더해지고 그들 사이에 단일 스페이스들을 추가한 더 큰 이름들이 그 결과이다.

ex)

$(addsuffix .c,foo bar)는 `foo.c bar.c'라는 결과를 만들어낸다.


$(addprefix prefix,names...)

ex)

$(addprefix src/,foo bar)는 `src/foo src/bar'라는 결과를 만든다.


$(wildcard pattern)

pattern 매개변수는 파일 이름 패턴이다. 전형적으로 와일드 카드 문자들 (쉘 파일 이름 패턴과 동일한) 을 담고 있다. wildcard 함수의 결과는 패턴과 일치하는 현존하는 파일들의 이름들을 스페이스로 분리한 리스트이다.


shell 함수(The shell Function)

ex)

contents := $(shell cat foo)

files := $(shell echo *.c)





출처:  http://korea.gnu.org/manual/4check/make-3.77/ko/make_8.html



아래의 내용은 숙지할 필요가 있다.


Make에 대해 알아야할 7가지

http://www.mimul.com/pebble/default/2014/12/26/1419569926542.html


'linux' 카테고리의 다른 글

top 명령어 세부사항  (0) 2018.07.02
표준입출력 redirect  (0) 2018.06.25
ubuntu default /bin/sh is dash  (0) 2018.06.22
ubuntu samba 설정하기  (0) 2018.06.21
useful linux system info commands  (0) 2018.06.20
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