https://developer.android.com/ndk/index.html

에서 ndk 다운후 압축 해제.


sdk를 설치한 디렉토리에 ndk 복사.


sdk와 마찬가지로  환경변수 PATH에 ndk경로 추가.{

vi ~/.bash_profile{

export PATH=$PATH:/ndk경로

}

source ~/.bash_profile

}


안드로이드 스튜디오에서 javah 설정


preference -> tools -> external tools 

javah를 사용하려면 당연히 jdk 설치



Android 에서 Project로 변경후  src/main 디렉토리에서 우클릭 후 JNI 폴더 생성.


JNI구현 순서


자바코드 작성

컴파일후 클래스 파일 얻기

javah 클래스에서 헤더파일 생성

생성한 헤더파일로 c/c++ 코딩

c/c++ 컴파일해서 라이브러리 생성

자바코딩된 어플리케이션에 라이브러리를 포함한 apk생성





원하는 클래스 생성뒤 사용하고싶은 함수 선언.

public class socket {
static {
System.loadLibrary("모듈명");
}
public static native String check(String str);
}

클래스 밑 함수 선언후 clean Project , Rebuild Project 해야함 안하면 클래스인식못해서 헤더파일 생성안댐


그 후에 생성한 클래스에서 우클릭후 javah 클릭 



우클릭 했을 때 NDK랑 javah 안뜨면 external tools 설정 안했기 때문.



jni폴더에 헤더파일 생성되었고 

JNIEXPORT jstring JNICALL Java_com_example_tmdahr1245_problem_socket_check(JNIEnv* env, jclass jc, jstring jstr);

헤더파일내 내가 위에서 사용하고 싶은 함수가 문법에 맞춰 선언되어있음.


JNIEnv, jclass는 반드시 인자값으로 들어가야 하며 내가 원하는 인자값을 만들때마다 뒤에 하나씩 추가댐


jstring을 c언어 char*로 변환할 때 

const char* str = (*env)->GetStringUTFChars(env, jstr, JNI_FALSE);

c언어 char*을 jstring으로 변환할 때 

jstring ret=(*env)->NewStringUTF(env, str);


이제 jni폴더에 c/cpp 파일 생성해서 

#include"com_example_tmdahr1245_problem_socket.h"

해주고 c언어로 코딩하면 사용가능


후에 설정해야 하는것은 


app/build.gradle에서

defaultConfig {
applicationId "com.example.tmdahr1245.problem"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"

ndk{
moduleName"모듈명"
}

}

gradle/gradle.properties에서


android.useDeprecatedNdk=true


gradle/local.properties 에서


ndk.dir=/Users/tmdahr1245/Library/Android/ndk/android-ndk-r12b(ndk 경로)


소캣 통신 할때에는 당연히 android_manifest.xml 에서


<uses-permission android:name="android.permission.INTERNET"/>



코드상 틀린게 없는데 안되면 안드로이드 스튜디오 껏다 키기




'안드로이드' 카테고리의 다른 글

Android Smali Code Example  (0) 2016.08.24

+ Recent posts