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 |
---|