Android NDK 개발 - 단순 데모(둘)

4146 단어 NDK
위에서 android 스튜디오 환경을 설정하여 NDK를 개발하는 방법을 소개했습니다. 이 편은 실전 개발을 통해 간단한 데모를 작성합니다.
  • MainActivity.java
  • public class MainActivity extends AppCompatActivity {
    
        //             “native-lib” 。
        static {
            System.loadLibrary("native-lib");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Example of a call to a native method
            TextView tv = (TextView) findViewById(R.id.sample_text);
            tv.setText(stringFromJNI());
        }
        //  C/C++  
        public native String stringFromJNI();
    }
    

    위에서 설명한 javah -jni 명령 도구를 사용하면 헤더com 생성 가능example_lynnlee_ndkdemo_MainActivity.h 파일
  • com_example_lynnlee_ndkdemo_MainActivity.h
  • /* DO NOT EDIT THIS FILE - it is machine generated */
    #include 
    /* Header for class com_example_lynnlee_ndkdemo_MainActivity */
    
    #ifndef _Included_com_example_lynnlee_ndkdemo_MainActivity
    #define _Included_com_example_lynnlee_ndkdemo_MainActivity
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_example_lynnlee_ndkdemo_MainActivity
     * Method:    stringFromJNI
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_com_example_lynnlee_ndkdemo_MainActivity_stringFromJNI
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    함수명Java_com_example_lynnlee_ndkdemo_MainActivity_stringFromJNI 구성: 클래스명방법명 구성.매개변수 JNIEnv * 및 jobject에는 JNIEnv의 jvm 포인터가 있어야 하며 jobject는 이 함수를 호출하는 java 클래스 참조를 가리킵니다.
    jni 디렉터리에 새 jnitest를 만듭니다.c 파일, 방금comexample_lynnlee_ndkdemo_MainActivity.h이름이 너무 길어서 jnitest로 변경되었습니다.h.
    //
    // Created by LynnLee on 2018/8/5.
    //
    #include "jnitest.h"
    
    JNIEXPORT jstring JNICALL Java_com_example_lynnlee_ndkdemo_MainActivity_stringFromJNI(JNIEnv *env, jobject obj)
    {
        return (*env)->NewStringUTF(env, "LynnLee");
    }
    

    함수 구현은 "LynnLee"문자열을 되돌려줍니다.
    jni 디렉터리에 새 안드로이드를 만듭니다.mk 파일, Android.mk 파일은 안드로이드의 makefile 파일입니다.
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := native-lib
    LOCAL_SRC_FILES := jnitest.c
    include $(BUILD_SHARED_LIBRARY)
    
  • LOCAL_PATH := $(call my-dir)

  • 매크로 함수 'my-dir' 는 컴파일러 시스템에서 제공하며, 현재 안드로이드를 포함하고 있는 것을 되돌려줍니다.mk 파일의 디렉토리 경로
  • include $(CLEAR_VARS)

  • CLEAR_컴파일 시스템에 의해 제공되는 VARS 제거 LOCALPATH 이외의 다른 LOCALXXX 변수
  • LOCAL_MODULE :=native-lib

  • 컴파일된 대상 객체, LOCALMODULE 변수는 당신이 안드로이드에 있다는 것을 표시하기 위해 정의해야 합니다.mk 파일에 기술된 모든 모듈입니다.이름은 고유해야 하며 공백이 없어야 합니다.주의: 컴파일 시스템은 자동으로 적합한 접두사와 접두사를 생성합니다. 다시 말하면,native-lib로 명명된 공유 라이브러리 모듈은'libnative-lib'를 생성합니다.so'파일.
  • LOCAL_SRC_FILES :=hello-jni.c LOCAL_SRC_FILES 변수는 모듈에 컴파일할 C/C++ 소스 코드 파일을 포함해야 합니다.헤더 파일과 포함 파일을 열거할 필요가 없습니다. 컴파일러 시스템은 자동으로 의존형 파일을 찾아낼 것입니다. 컴파일러에 직접 전달되는 원본 코드 파일만 열거하면 됩니다.

  • include $(BUILD_SHARED_LIBRARY)
    컴파일된 라이브러리 유형 지정 1.BUILD_SHARED_LIBRARY:동적 라이브러리,2.BUILD_STATIC_LIBRARY: 정적 라이브러리;3.BUILD_EXECUTEABLE: 실행 파일
    Application.mk
    APP_ABI := all
    

    APP_ABI는 네 가지 유형(기본값armeabi)이 있는데,armeabi,armeabi-v7a,x86,mips를 설정할 때 빈칸으로 구분하고,all는 모든 것을 표시합니다.
    라이브러리 생성
    app/CMakeLists를 수정해야 합니다.txt 파일은 다음과 같이 수정되었습니다.
     
    CMakeLists.txt.png
    전편에서 만든 ndk -build 명령 도구로 라이브러리 만들기
     
    소고.png
    라이브러리 작업
  • 1.main/libs 디렉터리에서 생성된 so 파일 (이름은lib+우리가 지정한 라이브러리 이름) 을 app/libs 디렉터리에 복사하고gradle에 so 라이브러리를 불러오는 설정을 추가합니다. 다음 코드는 다음과 같습니다:
  • sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    
  • 2.main 디렉터리에서 jni,libs,obj 세 개의 폴더를 삭제합니다.gradle 파일을 수정하고 다음 코드를 설명합니다:
  • /*externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }*/
    

    그렇지 않으면 오류 보고:
     
    오류png
    gradle 수정 아래 그림
     
    gradle.png
  • 3.그리고Activity에서 호출을 테스트하고, TextView에서 C++ 코드를 통해 실행하는 방법을 getPackname에서 app의 패키지 이름을 가져옵니다.

  • 실행 효과.png
    git 코드 경로:https://github.com/lynnleescz/NDKdemo

    좋은 웹페이지 즐겨찾기