안드로이드 JNI, NDK 달성

I. 서론
사용 JNI는, NDK? 이유
는 C / C ++의 효율성을보다 효율적으로 자바보다, 네이티브 언어
C 언어를 사용하기 전에 모듈을 통해 개발 된 경우 코드 마이그레이션, 당신은 코드를 기존의 c를 다시 사용할 수있는
자바 디 컴파일러는 C 언어보다 쉽습니다 디 컴파일 할 일반적인 암호화 알고리즘을 C 언어로 작성된, 쉬운 일이 아닙니다

둘째, 구성 환경
1. 환경 변수를 JDK를 설치, 구성 :
JAVA_HOME 환경을 : D : \ installSoftCache \ jdk1.8.0_31 (JDK 설치 디렉토리)
는 CLASSPATH :;. JAVA_HOME의 %의 \ lib 디렉토리 (. JDK 디렉토리 참조,주의 앞) %
증가 경로 : D : \ installSoftCache \ jre1.8.0_31 \ 빈

문제가 발생하는 경우 : 환경 변수가 구성되어 있지 않거나 안드로이드 스튜디오 터미널 창에서 JDK 디렉토리를 참조하는 명령을 입력하지 않기 때문에 "javah의에서 안드로이드는 내부 명령이 아닌"
setX는 PATH "%는 PATH %; D : \ installSoftCache는 \ jre1.8.0 _31 \ 빈 "

셋째, 프로젝트는 네이티브 메소드를 달성하기 위해
새로운 안드로이드 프로젝트를 생성 1. 패키지 이름 com.whh.jni4ndk

2. 새 패키지 NDK, 어떤 새로운 NDKTools.class 파일
파일의 내용

public class NDKTools {
    static {
        System.loadLibrary("jni4ndk-jni");
    }

    public static native String getStringFromNDK();
}

네이티브 UI를 요약 디스플레이

 String text = NDKTools.getStringFromNDK();
 ((TextView)findViewById(R.id.tv)).setText(text);

4. 클래스 파일을 생성하는 프로젝트를 컴파일

: 터미널 창에서 5. 응용 프로그램 \의 SRC \의 미안 디렉토리를 입력 명령을 입력
E를 : \ Android_workspace \ JNI4NDK \ 응용 프로그램 \ SRC \ 주요> javah의 -d JNI -jni -classpath .... \ \ 중간체 \ 클래스를 구축 \ 디버그 com.whh.jni4ndk.ndk.NDKTools
JNI4NDK 앱이 SRC는 주요 \ \ \ \ 몇 초 후 JNI 로는 세대 com_whh_jni4ndk_ndk_NDKTools.h 파일 다음 다음

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_whh_jni4ndk_ndk_NDKTools */

#ifndef _Included_com_whh_jni4ndk_ndk_NDKTools
#define _Included_com_whh_jni4ndk_ndk_NDKTools
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_whh_jni4ndk_ndk_NDKTools
 * Method:    getStringFromNDK
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_whh_jni4ndk_ndk_NDKTools_getStringFromNDK
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

6. 디렉토리 JNI에 해당이 .c 파일을 추가합니다

#include "com_whh_jni4ndk_ndk_NDKTools.h"

JNIEXPORT jstring JNICALL Java_com_whh_jni4ndk_ndk_NDKTools_getStringFromNDK
  (JNIEnv *env, jobject obj){
     return (*env)->NewStringUTF(env,"Hellow World,这是慧慧同学的NDK的第一行代码");
  }

다음과 같이 읽어 디렉토리 JNI, 7. 증가 Android.mk 파일 :


include $(CLEAR_VARS)

LOCAL_MODULE    := jni4ndk-jni

LOCAL_SRC_FILES := jni4ndktest.c

include $(BUILD_SHARED_LIBRARY)

8. 확인 local.properties 파일이 들어 디렉토리 구성을 NDK, 구성이되지
NDK를 선택 목록에 장착 AS-설정 - 검색 sdk- 선택 SDK 했답니다를 열


3013099-5c5aae33c6b8f091.png
NDK 다운로드

최종 문서에서 local.properties 추가 :

ndk.dir=D\:\\installSoftCache\\Android\\sdk\\ndk-bundle
sdk.dir=D\:\\installSoftCache\\Android\\sdk

gradle.properties 프로젝트에 파일을 추가 할 필요가 뒤에 NDK 구성, 프로젝트 지원 NDK을 완료 :

Android.useDeprecatedNdk=true 

그래서 build.gradle 응용 프로그램 모듈 디렉토리 내용의 증가를 파일을 생성하기 위해 9


3013099 - f4d04dfb70d73b44.png
응용 프로그램 Gradle을 구성
ndk{
            moduleName "jni4ndk-jni"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
externalNativeBuild {
            ndkBuild {
                path 'src/main/jni/Android.mk'
            }
        }
        sourceSets.main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['src/main/jniLibs']
        }

四、总结
JNI和NDK
JNI是Java调用Native 语言的一种特性,属于Java,Java本地接口,使Java与本地其他类型语言交互(C++)
实现步骤:在Java中声明Native方法,编译该文件得到.class文件,通过javah命令导出JNI头文件(.h文件),使用Java需要交互的本地代码实现子啊Java中声明的Native方法,编译so文件,通过Java执行Java程序,最终实现Java调用本地代码
NDK(Native Develop Kit):Android开发工具包,属于Android。
作用:快速开发C、C++动态库,并自动将so文件和应用打包成APK,即可通过NDK在Android中使用JNI与本地代码(C、C++)交互(Android开发需要本地代码C、C++实现)
特点:运行效率高,代码安全性高,功能拓展性好,易于代码复用和移植。
使用步骤:①配置NDK环境;②创建Android项目,并于NDK进行关联;③在Android项目中声明所需调用的Native方法;④使用该Native方法;⑤通过NDK build命令编译产生so文件;⑥编译AS工程,实现调用本地代码。
JNI和NDK的关系:JNI实现目的,NDK是Android实现JNI的手段,即在AS开发环境中通过NDK从而实现JNI功能。

참고 기사 :
일일 마스터 안드로이드 JNI 로컬 프로그래밍 빠른 시작 - rocomp - 블로그 공원
https://www.cnblogs.com/rocomp/p/4892866.html
안드로이드 JNI 학습 (II) - JNI는 "안녕하세요!"를 방지 - 제인 예약
https://www.jianshu.com/p/b4431ac22ec2를

진보의 조금 매일 (2019년 6월 2일) :
나는 예술 카탈로그의 수집 작품을 공유 https://www.jianshu.com/p/23485c157d76

추천

출처blog.csdn.net/weixin_34415923/article/details/90967384