반응형

android 프로그램을 개발하다 보면, 종종 C++ 또는 C로 작성된 코드를 사용해야 하거나, xxx.a 또는 yyy.so 와 같은 static library 또는 shared library 를 사용해야 하는 상황들이 발생합니다.

 

static library 

static library는 소스(source) 빌드시  링킹 시점에 심볼(symbol)이 연결됩니다.

주로  xxx.a 처럼 .a 확장자를 사용합니다.

shared library 

shared library는 런타임(runtime, 실행시점)때 필요시점에 library를 로딩해서 symbol이 연결됩니다.

주로 .so 또는 .dll 확장자로 사용됩니다.

 

이런 경우를 위해서 java에서는 JNI(java native interface) 를 제공하고 있습니다.

 

Android Studio 에서 기본적으로 CMake와 make file 을 통해서 구현이 가능합니다.

 

    static {
        System.loadLibrary("native-lib");
    }
    private native String stringFromJNI();

 

extern "C" JNIEXPORT jstring JNICALL
Java_com_my_package_JniClass_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

 

그러나 android 가 vm 위에서 동작하는 것과 달리 native code는 platform에 종속성(dependency)를 가지게 되니, 빌드 환경이나 플랫폼에 영향을 받게 됩니다.

 

 

C++ 관련 link error

ld: error: undefined symbol: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
  >>> referenced by string:1078 (external/libcxx/include/string:1078)

 

때문에 ndk build 시 에러가 발생하는 경우들이 나옵니다.

android jni 의 native build error 는 주로 아래 so들 때문에 발생하는 경우들이 많습니다.

c++관련 toolchain file 인데,  android 에서는 어떤 이유에선지 해당 so file들을 제공하지 않습니다.

build 시 또는 runtime에 에러가 발생하게 됩니다.

 

libc++.so, libbase.so, libcutils.so

 

https://developer.android.com/about/versions/nougat/android-7.0-changes?hl=ko 

 

Android 7.0 동작 변경 사항  |  Android 개발자  |  Android Developers

Along with new features and capabilities, Android 7.0 includes a variety of system and API behavior changes. This document highlights some of the key changes that you should understand and account for in your apps. If you have previously published an …

developer.android.com

 

만들고자 하는 native lib을 static으로 만들면 build는 해결할 수 있지만, java에서 c++ native  symbol link 과정은 컴파일(compile)시에 결정되는 것이 아니라 런타임(runtime linking 또는 dynamic linking )을 하기 때문에 so file을 사용해야 합니다.

 

즉 해결 방법은, libc++.so, libbase.so, libcutils.so 파일들을 모두 application library로 포함 시켜야 합니다.

 

 

 

'Android, Java,Kotlin' 카테고리의 다른 글

[Copy&Paste]String 다루기  (0) 2020.11.11
[Copy&Paste] Array를 List로 바꾸기  (0) 2020.11.04
[Android] JavaDoc 사용법 링크.  (0) 2020.10.28
반응형

 

byte[] to String

 byte[] ={'a','b',};
 String str = new String(data, StandardCharsets.UTF_8);
 
 
 
 byte[] ={'a','b',};
 String str = new String(data);

 

String.toCharArray()

 

String str = "abcdefg";
char [] array = str.toCharArray();

 

 

String.getBytes();

String str= "Hello";
byte buff[] = str.getBytes();
//charset
byte buff1[] = str.getBytes(StandardCharsets.UTF_8);

//charset string
try {
	byte buff2[] = str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
	e.printStackTrace();
}

 

byte[] to String

String str = "Hello";
byte buff[] = str.getBytes();
String str1 = new String(buff);

 

 

InputStream -> ByteArrayOutputStream -> String

(주로 File IO, Asset , network등 이용하는 경우 많이 사용하게 됨.)

 

InputStream input = this.getContext().getAssets().open("mytextfile.txt");

try {
	ByteArrayOutputStream result = new ByteArrayOutputStream();

	byte buff[] = new byte[1024];
	int length;
	while( (length = input.read(buff,0, 1024)) != -1){
		result.write(buff,0,length);
	}
	String str = result.toString("UTF-8");

} catch (IOException e) {
	e.printStackTrace();
}

 

 

 

'Android, Java,Kotlin' 카테고리의 다른 글

JNI, Native code build 시 유의점  (0) 2022.04.21
[Copy&Paste] Array를 List로 바꾸기  (0) 2020.11.04
[Android] JavaDoc 사용법 링크.  (0) 2020.10.28
반응형

Array를 List로 바꾸기

자주 사용하게 되는데 잊어버릴때가 많아서 메모!!!!! 해둠.

 

Arrays.asList

asList: static <T> List<T> asList(T... a)
  
쓰는 방법은?

List<String> outList = Arrays.asList("a","b","C"); 
List<String> outList2 = Arrays.asList(new String [] {"a", "b", "C"}); 
int[] list = {1,2,3,4,5,6}; 
List list = Arrays.asList(list); // List<Integer> list로 받을 수 없음 
list.add(7); // Exception in thread "main" java.lang.UnsupportedOperationException

 

Arrsys.asList의 return값이 java.util.Arrays.ArrayList(!= java.util.ArrayList)로 immutable이다

그래서 Array.asList(_array_)로 쓰지 말고 아래와 같이 쓰자

 

ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

 

List를 Array로 바꾸기

List<String> arrayList = Arrays.asList("a","b","C");  String[] array = arrayList.toArray(arrayList);

 

 

출처 : ilovejinwon.tistory.com/54

'Android, Java,Kotlin' 카테고리의 다른 글

JNI, Native code build 시 유의점  (0) 2022.04.21
[Copy&Paste]String 다루기  (0) 2020.11.11
[Android] JavaDoc 사용법 링크.  (0) 2020.10.28
반응형

 

Java doc 의 문법으로 현재 구현중인 프로젝트의 문서화를 편리하게 관리할 수 있습니다.

 

 

 

www.devkuma.com/books/pages/1249

'Android, Java,Kotlin' 카테고리의 다른 글

JNI, Native code build 시 유의점  (0) 2022.04.21
[Copy&Paste]String 다루기  (0) 2020.11.11
[Copy&Paste] Array를 List로 바꾸기  (0) 2020.11.04

+ Recent posts