Android 에서 JNI 의 사용 중 하나: 자바 원생 JNI 의 사용, 자바 명령 의 사용 및 도해 교재
Android 시스템 에 서 는 JNI 방식 으로 C / C + 방법 을 호출 하 였 으 나, Android 시스템 에 서 는 자바 JNI 의 사용 을 더욱 강화 하여 JNI 의 호출 을 더욱 효율 적 으로 하 였 다.따라서 전반적 으로 안 드 로 이 드 시스템 에 서 는 JNI 를 두 가지 방식 으로 사용 할 수 있다.첫 번 째: 자바 네 이 티 브 JNI, dll 등 동적 링크 라 이브 러 리 사용 ;두 번 째, Android 강화 판 JNI 는 동적 로드 *. so 링크 라 이브 러 리 를 통 해 JNI 호출 을 진행 합 니 다.오늘 우 리 는 첫 번 째 JNI 사용 방식 을 분석 한 것 도 JNI 입문 이 라 고 할 수 있다.
자바 와 다른 프로 그래 밍 언어 가 사용 하 는 문법 이 다 르 기 때문에 자바 와 C / C + + 라 이브 러 리 함수 가 통신 할 수 있 도록 약 정 된 매개 변수 유형 은 다음 과 같 습 니 다.
Java 형식 C / C + + 형식
void void
jboolean boolean
jint int
jlong long
jdouble double
jfloat float
jbyte jbyte
jchar char
jshort shor
위 에 있 는 것 은 간단 한 유형의 맵 일 뿐 입 니 다. 그 다음 에 우 리 는 다른 매개 변수 유형의 맵 을 보완 할 것 입 니 다.
개발 환경 소개 (Windows 아래):
Eclipse: 자바 프로젝트 를 만 드 는 데 주로 사 용 됩 니 다.
MicrosoftVC++6.0: 동적 링크 라 이브 러 리 생 성
1. Eclipse 를 사용 하여 자바 프로젝트 를 만 듭 니 다.
이 예 에서, 우 리 는 간단하게 자바 프로젝트 Hello BabyJNI 를 만 들 었 습 니 다. 프로젝트 의 절대 경 로 는 E: \ MyCode \ \ AndroidCode \ \ Hello BabyJNI 경로 에 있 습 니 다. 메 인 파일 경 로 는 \ src \ lover \ hellojni 경로 에 있 습 니 다. (경 로 는 뒤의 자바 컴 파일 에 매우 중요 합 니 다)
HelloBabyJNI. java 파일 은 다음 과 같 습 니 다.
package com.lover.hellojni;
/**
* Java JNI
*
*/
public class HelloBabyJNI {
/*
* , HelloBabyJNI , dll :HelloBabyJNI.dll ---> MSVC6.0
*/
static {
System.load("E:/HelloBabyJNI.dll"); // dll
}
/*
* Java C/C++ (native method), C/C++
*/
public native int add(int a, int b);
// main , C/C++
public static void main(String[] args) {
HelloBabyJNI helloBabyJNI = new HelloBabyJNI();
// add
int result = helloBabyJNI.add(2, 3);
//
System.out.println("after invoke the native method,the result is "+ result);
}
}
2, HelloBabyJNI. java 파일 을 컴 파일 하고 HelloBabyJNI. class 파일 을 생 성 합 니 다. 경로 \ src \ \ lover \ hellojni \ \ HelloBabyJNI. class 에 있 습 니 다.
3. 자바 명령 을 사용 하여 HelloBabyJNI. class 파일 을 컴 파일 하고 자바 와 C / C + + 간 에 통신 하 는 약정 인 터 페 이 스 를 생 성 합 니 다. 자바 에서 nativemethod 가 C / C + + 의 구체 적 인 인 인 터 페 이 스 를 규정 합 니 다.cmd 를 실행 한 후 E: \ MyCode \ \ AndroidCode \ \ HelloBabyJNI \ \ src 경로 에 들 어가 javah 명령 을 사용 합 니 다. 명령 집합 형식 은 다음 과 같 습 니 다.
javah -classpath E:\MyCode\AndroidCode\HelloBabyJNI\src -jni com. lover. hellojni. HelloBabyJNI, 구체 적 인 명령 용법 은 javah – help 를 참고 할 수 있 습 니 다. 본 고 는 다시 응용 할 뿐 입 니 다.
그림 에서 보 듯 이:
성공 적 으로 실행 되면 src 폴 더 에서 come 을 찾 을 수 있 습 니 다.lover_hellojni_Hello BabyJNI. h 파일, 이 파일 은 우리 가 찾 아야 할 약속 인터페이스 입 니 다. 패키지 이름자바 파일 이름.이해 할 수 있 도록 Hello BabyJNI. h 파일 로 이름 을 바 꿉 니 다. 내용 은 다음 과 같 습 니 다.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_lover_hellojni_HelloBabyJNI */
#ifndef _Included_com_lover_hellojni_HelloBabyJNI
#define _Included_com_lover_hellojni_HelloBabyJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_lover_hellojni_HelloBabyJNI
* Method: add
* Signature: (II)I
*/
/*
* java native method javah
*
*/
JNIEXPORT jint JNICALL Java_com_lover_hellojni_HelloBabyJNI_add
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
PS: 1, - jni 명령 은 javah 에서 기본 옵션 이기 때문에 무시 할 수 있 습 니 다.
2. Dos 에서 현재 경 로 를 대표 합 니 다. 즉, E: \ MyCode \ \ AndroidCode \ \ Hello BabyJNI \ src 입 니 다. 현재 경 로 를 간단하게 사용 할 수 있 습 니 다.
따라서 간단 한 자바 명령 은 다음 과 같다.
또한, 우 리 는 프로젝트 menu 의 빈 폴 더 에서 자바 명령 을 실행 할 수 있 으 며, 위의 빈 을 src 로 교체 하면 됩 니 다.물론 마지막 으로 생 성 된. h 파일 은 빈 폴 더 아래 에 있 습 니 다.
2. MS VC 를 사용 하여 dll 동적 링크 라 이브 러 리 생 성:
1. DLL 프로젝트 를 만 듭 니 다. 다음 과 같 습 니 다.
2, 다음, A simple DLL project 선택
3. 다음 에 HelloJNI 프로젝트 를 생 성하 여 File View 보기 로 전환 합 니 다.
우선, 이전에 생 성 된 Hello BabyJNI. h 헤더 파일 을 가 져 옵 니 다. (제 VC 환경 에 문제 가 있 을 수 있 습 니 다. 저 는 여기 서 Hello BabyJNI. h 파일 을 새로 만 들 었 습 니 다. 복사 합 니 다. 우리 가 이전에 javah 를 통 해 생 성 한. h 의 파일 내용 을 베 어 냈 다)
둘째, StDAx. h 파일 에 다음 과 같이 인용 할 헤더 파일 을 추가 합 니 다.
셋째, Hello BabyJNI. cpp 에 우리 의 native method 방법 을 추가 하여 실현 하고 해당 하 는 형 삼 을 추가 합 니 다.
// HelloBabyJNI.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
return TRUE;
}
// VC /*
/* java native , Java_ _
* JNIEXPORT JNICALL JNIEnv jobject Jni
* C++ */
JNIEXPORT jint JNICALL Java_com_lover_hellojni_HelloBabyJNI_add
(JNIEnv * env, jobject, jint a, jint b)
{
int result =a+b ;
return result ;
}
, result java 。
, , 。 Java JNI , jdk 。
: VC Tools-Options…, 。 Directories , jdk include include/win32 。
dll ---> Build--->Build HelloBabyJNI.dll , ,
Debug HelloBabyJNI.dll 。
、 Java
, Java dll , HelloBabyJNI.dll, C:\Window\System32 (Window7 )。 Java 。 :
:
Java JNI , :
1、javah ;
2、 ;
3、 (.h) native method 。
, Java JNI 。