Android 에서 JNI 의 사용 중 하나: 자바 원생 JNI 의 사용, 자바 명령 의 사용 및 도해 교재

자바 네 이 티 브 인터페이스 (JNI, 중국어 이름 자바 로 컬 인터페이스) 표준 시 자바 플랫폼 의 일부분 은 자바 코드 와 다른 언어 로 작 성 된 코드 가 상호작용 을 할 수 있 도록 합 니 다.JNI 는 로 컬 프로 그래 밍 인터페이스 로 자바 가상 머 신 (VM) 내부 에서 실행 되 는 자바 코드 를 다른 프로 그래 밍 언어 (예 를 들 어 C, C + + 어 셈 블 리 언어) 로 작 성 된 응용 프로그램 과 라 이브 러 리 로 상호작용 할 수 있 도록 합 니 다.JNI 의 주요 용 도 는 하드웨어 에 대한 접근 과 효율 성 을 추구 하거나 C / C + 라 이브 러 리 를 다시 사용 할 수 있 도록 하 는 것 이다.
    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 。

                

 

 
  
 
  
 
 

좋은 웹페이지 즐겨찾기