android 에서 JNI 개발--01

what JNI 가 뭐야?
  • JNI 자바 네 이 티 브 인터페이스 네 이 티 브 로 컬 자바 로 컬 인터페이스
  • JNI 를 통 해 자바 와 로 컬 코드 간 의 상호 호출 을 실현 할 수 있 습 니 다
  • jni 는 번역 이 라 고 볼 수 있 지만 실제로는 협의 입 니 다
  • why JNI 를 왜 써 요?
  • 자바 컴 파일 이 여기저기 실행 되 고 있 습 니 다.
  • ① 자바 가 가상 컴퓨터 에서 실행 되 는 JNI 는 자바 가상 컴퓨터 의 능력 을 확장 하여 자바 코드 가 구동 을 호출 할 수 있 도록 합 니 다
  • ② 자바 는 해석 형 언어 운행 효율 이 상대 적 으로 낮은 C/C++의 효율 이 높 습 니 다.jni 를 통 해 시간 소모 조작 방법 C/C++를 통 해 자바 운행 효율 을 높 일 수 있 습 니 다
  • ③ 자바 코드 로 컴 파일 된.class 파일 의 안전성 이 떨 어 지 므 로 jni 를 통 해 중요 한 업무 논 리 를 c/c++에 두 어 실현 할 수 있 습 니 다.c/c+역 컴 파일 이 어렵 고 안전성 이 높 습 니 다
  • C 역사가 유구 한 1972 년 C 는 JNI 를 통 해 우수한 C 오픈 소스 라 이브 러 리 를 호출 할 수 있 습 니 다
  • JNI 어떻게 써 요?
  • java
  • c/c++알 아 보고 호출 할 수 있 습 니 다
  • JNI 개발 프로 세 스 NDK native develop kit
  • C 기본 문법
    CHelloWorld
    #include    //     java import .h c     stdio.h standard io        
    #include   // stdlib standard library          java.lang 
    /**
    */
    main(){    // public static void main(String[] args)
           printf("helloworld!
    "); //System.out.println(); "
    " system("javac Hello.java"); system("java Hello"); system("notepad"); system("pause"); //system windows }

    C 의 기본 데이터 형식
  • 자바 기본 데이터 형식 boolean 1 byte 1 char 2 char 1 바이트 short 2 int 4 int 4 long 8 long 4 float 4 float 4 double 8 double 8
  • char, int, float, double, long, short, signed, unsigned,void*signed 기호 수의 가장 높 은 위 치 는 기호 비트 로 음 수 를 나 타 낼 수 있 지만 표시 하 는 최대 치 는 상대 적 으로 작 습 니 다*unsigned 부호 가 없 는 가장 높 은 위 치 는 수치 비트 로 음수 가 표시 하 는 최대 치 는 상대 적 으로 크다 는 것 을 나 타 낼 수 없습니다*signed unsigned 는 성형 변수 char short int long*C 에 boolean byte C 가 없 으 면 0 과 0 으로 false true 를 나 타 낼 수 있 습 니 다.
    C 의 출력 함수
    %d  -  int
    %ld – long int
    %lld - long long
    %hd –    
    %c  - char
    %f -  float
    %lf – double
    %u –     
    %x –        int   long int   short int
    %o -       
    %s –    
    
  • 자리 표시 자 를 함부로 사용 하지 말고 정확 한 대응 유형 을 선택 하 십시오.그렇지 않 으 면 정밀도 가 손실 될 수 있 습 니 다
  • C 문자열
  • C String 형식 C 가 없 는 문자열 은 실제 문자 배열
  • C 배열 정의[]변수 이름 만 추가 할 수 있 습 니 다
  • C 문자열 의 두 가지 정의 방식
    char str[] = {'h','e','l','l','o','\0'};//  '\0'      
    char str[] = "  "; //                   
    

  • C 의 입력 함수
  • scanf("자리 차지 문자",&주소);
  • &주소 찾기
  • C 문자열 이 아래 표 시 된 경 계 를 넘 어 사용 할 때 주의 하 십시오
  • 메모리 주소 개념
  • 변 수 를 설명 하면 바로 이 변수 에 메모 리 를 신청 합 니 다.반드시 해당 하 는 메모리 주소 가 있 을 것 입 니 다
  • 주소 가 없 는 메모 리 는 사용 할 수 없습니다
  • 메모리 의 모든 바이트 에 해당 하 는 주소 가 있 습 니 다
  • 메모리 주 소 는 16 진수 로 표시 합 니 다
  • 32 비트 운영 체제 최대 4G 메모리 지원
  • 32 비트 시스템 의 주소 버스 는 32 비트 입 니 다.즉,시스템 은 2^32 개의 숫자 를 메모리 에 주소 로 사용 할 수 있 습 니 다

  • 포인터 입문**
     int i = 123;
           //       16             
           printf("%#x
    ",&i); //int* int pointer // &i i pointer // pointer i int* pointer = &i; printf("pointer = %#x
    ",pointer); printf("*pointer %d
    ",*pointer); *pointer = 456; printf("i %d
    ",i); system("pause");

    *포인터 에서 흔히 볼 수 있 는 오류*포인터 변 수 를 설명 한 후 초기 화 되 지 않 고*p 를 통 해 할당 작업 을 실행 할 때 오류 가 발생 합 니 다**할당 되 지 않 은 포인터*포인터 형식 오 류 는 int*p 가 double 형식의 주 소 를 가리 키 는 것 과 같 습 니 다.포인터 로 읽 기 작업 을 할 때 읽 기 값 이 잘못 될 수 있 습 니 다.
    지침 연습
  • 값 전달 과 인용 전달(두 수의 값 교환)
  • 인용 전달 의 본질은 주 소 를 전달 하 는 것 입 니 다
  • 모든 전달 은 본질 적 으로 값 전달 이 고 인용 전달 도 하나의 값 을 전달 하지만 이 값 은 메모리 주소
    void swap(int* p, int* p2){
        int temp = *p;
        *p = *p2;
        *p2 = temp; 
    }
    main(){
        int i = 123;
        int j = 456;
        // i, j       
        swap(&i,&j);
        printf("i = %d, j = %d", i, j);
    }
    
  • 여러 값 을 되 돌려 줍 니 다.
  • 주 소 를 매개 변수 로 함수 에 전송 합 니 다.함수 가 실 행 될 때 매개 변수의 값 은 이미 수정 되 었 습 니 다

  • 다단 계 포인터
  • int* p; int 형식의 1 급 포인터 int**p2;int 형식의 2 급 포인터
  • 2 급 포인터 변 수 는 1 급 포인터 변수의 주소 만 저장 할 수 있 습 니 다
  • 몇 개*가 있 으 면 몇 개의 포인터 int**3 급 포인터
  • int 타 입 3 급 포인터 로 int 타 입 변 수 를 조작 하 는 값**p
        int i = 123;
        //int       
        int* p = &i;
        //int                         
        int** p2 = &p;
        //int                          
        int*** p3 = &p2;
        //  p3    i  
        printf("***p3 = %d
    ", ***p3);
  • 다단 계 포인터 사례 추출 서브 함수 의 임시 변수의 주소
  • 배열 과 포인터 의 관계
  • 배열 이 사용 하 는 메모리 공간 은 연속 적 인
  • 배열 변 수 는 0 번 째 요소 주소,즉 첫 번 째 주소
  • *(p+1):포인터 가 한 단위 로 이동 하고 한 단위 가 몇 개의 바이트 인지 포인터 의 유형 에 달 려 있 습 니 다
  • 포인터 길이
  • 변수의 유형 이 무엇이든 메모리 주소 의 길 이 는 반드시 같 습 니 다
  • 유형 에 따라 변수 만 사용 하 는 메모리 공간 이 다 릅 니 다
  • 32 비트 환경 에서 메모리 주소 길 이 는 모두 4 개의 바이트 이기 때문에 포인터 변수 길 이 는 4 개의 바이트 만 있 으 면 됩 니 다
  • 포인터 유형 을 구분 하 는 것 은 포인터 변위 연산 이 편리 하기 위 한 것 입 니 다
  • 스 택 개념 정적 메모리 할당 동적 메모리 할당
  • 스 택 메모리
  • 시스템 자동 분배
  • 시스템 자동 소각
  • 연속 메모리 영역
  • 낮은 주소 로 확장
  • 크기 고정
  • 스 택 에 분 배 된 메모 리 를 정적 메모리 라 고 합 니 다
  • 정적 메모리 할당
  • 하위 함수 가 실행 되면 하위 함수 의 모든 부분 변 수 는 소각 되 고 메모리 가 방출 되 지만 메모리 주 소 는 소각 되 지 않 습 니 다.주소 의 값 만 없어 집 니 다
  • 메모리 더미
  • 프로그래머 수 동 할당
  • java:new
  • c:malloc

  • 공간 불 연속
  • 크기 는 시스템 의 가상 메모리 에 달 려 있 습 니 다
  • C:프로그래머 수 동 회수 free
  • java:자동 회수
  • 쌓 아 올 린 메모 리 를 동적 메모리 라 고 합 니 다

  • 구조 체
  • 구조 체 중의 속성 길 이 는 자동 으로 보 정 됩 니 다.이것 은 포인터 변위 연산 을 편리 하 게 하기 위해 서 입 니 다
  • 구조 체 에서 함 수 를 정의 할 수 없습니다.함수 지침 을 정의 할 수 있 습 니 다
  • 프로그램 이 실 행 될 때 함수 도 메모리 에 저 장 됩 니 다.주소
  • 구조 체 에서 변수 만 정의 할 수 있 습 니 다
  • 함수 포인터 도 변수 입 니 다.포인터 변수
  • 함수 포인터 의 정의 반환 값 형식(*변수 이름)(받 은 매개 변수);
  • 함수 포인터 의 할당:함수 포인터 는 반환 값 과 받 은 매개 변수 와 같은 함수 만 가리 킬 수 있 습 니 다
  • 연합 체
  • 길 이 는 연합 체 에서 정의 하 는 변수 중 가장 긴 것 과 같 습 니 다
  • 연합 체 는 하나의 변수의 값 만 저장 할 수 있 습 니 다
  • 연합 체 공용 메모리
  • 좋은 웹페이지 즐겨찾기