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 kitC 기본 문법
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 8char, 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:프로그래머 수 동 회수 freejava:자동 회수쌓 아 올 린 메모 리 를 동적 메모리 라 고 합 니 다 구조 체
구조 체 중의 속성 길 이 는 자동 으로 보 정 됩 니 다.이것 은 포인터 변위 연산 을 편리 하 게 하기 위해 서 입 니 다구조 체 에서 함 수 를 정의 할 수 없습니다.함수 지침 을 정의 할 수 있 습 니 다프로그램 이 실 행 될 때 함수 도 메모리 에 저 장 됩 니 다.주소구조 체 에서 변수 만 정의 할 수 있 습 니 다함수 포인터 도 변수 입 니 다.포인터 변수함수 포인터 의 정의 반환 값 형식(*변수 이름)(받 은 매개 변수); 함수 포인터 의 할당:함수 포인터 는 반환 값 과 받 은 매개 변수 와 같은 함수 만 가리 킬 수 있 습 니 다연합 체
길 이 는 연합 체 에서 정의 하 는 변수 중 가장 긴 것 과 같 습 니 다연합 체 는 하나의 변수의 값 만 저장 할 수 있 습 니 다연합 체 공용 메모리