자바 가 Liux 에서 C/C++로 생 성 된 so 파일 을 호출 합 니 다.

자바 가 Liux 에서 C/C++로 생 성 된 so 파일 을 호출 합 니 다.
CplusUtil.java 는 자바 웹 프로젝트 의 도구 클래스 입 니 다.
CplusUtil.java 내용 은 다음 과 같 습 니 다.
package cn.undoner.utils;

/**
 * Created by ${undoner} on 16-2-25.
 */
public class CplusUtil {

    public native void sayHello();

    static{
        System.out.println(System.getProperty("java.library.path"));
        System.load("/usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so");
    }

    public static void main(String[] args){
        CplusUtil h = new CplusUtil();
        h.sayHello();
    }
}

해당 클래스 파일 생 성
IDE 도구(Eclipse/IntellJ/javac 등)를 통 해 전체 프로젝트 를 컴 파일 할 수 있 으 며,해당 class 파일 을 생 성 할 수 있 습 니 다.
/   /target/classes/cn/undoner/utils/CplusUtil.class

.h 파일 추가
utils 에 필요 한 c 함수 에 해당 하 는.h 헤더 파일 생 성
메모:가방 이름 이 있 는 경우.h 헤더 파일 을 만 들 려 면 가방 이름 경 로 를 가 져 가 는 것 을 기억 하 십시오.
javah -classpath classes -jni cn.undoner.utils.CplusUtil

파일 생 성:cn_undoner_utils_CplusUtil.h 내용 은 다음 과 같다.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class cn_undoner_utils_CplusUtil */


#ifndef _Included_cn_undoner_utils_CplusUtil
#define _Included_cn_undoner_utils_CplusUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     cn_undoner_utils_CplusUtil
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello
  (JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif

c 함수 작성
파일:MyJni.c 내용 은 다음 과 같다.
#include 
#include "cn_undoner_utils_CplusUtil.h"
#include 

JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello(JNIEnv *env,jobject obj){
    printf("Hello JNI");
    return;
}

컴 파일.c 파일
.c 파일 을.o 로 컴 파일 하고.so 또는.dll 파일 로 다시 변환 합 니 다.
gcc -fPIC -D_REENTRANT -I /usr/lib/jvm/java/include -I /usr/lib/jvm/java/include/linux -c MyJni.c

파일 생 성:MyJni.o.o 파일 을.so 파일 로 컴 파일 합 니 다.
gcc -shared MyJni.o -o MyJni.so

파일 생 성:MyJni.so본문 MyJni.so 경 로 는:
/usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so

CplusUtil.class 실행
ide 에서 CplusUtil 을 실행 하거나 자바 명령 을 직접 실행 합 니 다:
java cn.undoner.utils.CplusUtil

결실
/usr/lib/jvm/java/jre/lib/amd64/server:
/usr/lib/jvm/java/jre/lib/amd64:
/usr/lib/jvm/java/jre/../lib/amd64:
/home/vobile/java_tool/idea-IU-141.178.9/bin::
/usr/java/packages/lib/amd64:
/usr/lib64:
/lib64:
/lib:
/usr/lib
Hello JNI

주:System.getProperty("java.library.path")다음 정 보 를 본 컴퓨터 의 lib 경로 로 출력 합 니 다.
/usr/lib/jvm/java/jre/lib/amd64/server:
/usr/lib/jvm/java/jre/lib/amd64:
/usr/lib/jvm/java/jre/../lib/amd64:
/home/vobile/java_tool/idea-IU-141.178.9/bin::
/usr/java/packages/lib/amd64:
/usr/lib64:/lib64:
/lib:/usr/lib

Liux 에서 자바 호출 so 파일 을 간소화 합 니 다.다음 과 같은 몇 가 지 를 주의해 야 한다.
Liux 에서 호출 된 so 파일 의 형식 은 x86 이나 다른 것 이 아니 라 Liux 여야 합 니 다
Liux 가 포장 한 so 파일 의 자릿수 는 이 컴퓨터 JVM 의 자릿수 와 같 아야 합 니 다.모두 32 비트 또는 64 비트 이 며,JVM 의 자릿수 는 자바-version 을 통 해 볼 수 있 습 니 다.자릿수 가 일치 하지 않 으 면 다음 과 같은 오류 가 발생 합 니 다.wrong ELF class:ELFCLASS 64(Possible cause:architecture word width mismatch)http://www.yanzuoguang.com:9000/upload/2017/11/sn2q6bsk58hb2rh9cb6mvmu3bd.png
so 패키지 path 설정 해 야 합 니 다.설정 하지 않 으 면 다음 과 같은 오 류 를 보고 합 니 다:java.lang.UnsatisfiedLinkError:no**in java.library.pathhttp://www.yanzuoguang.com:9000/upload/2017/11/6gshbosr44h8uohu2tidquf120.png
쓸 수 있다 System.out.println("java.library.path:"+System.getProperty("java.library.path"))은 path 가 무엇 인지 봅 니 다.오류 가 발생 한 이 유 는 자바 path 에서 so 가방 을 찾 을 수 없 기 때 문 입 니 다.해결책 은 두 가지다.a.대응 하 는 path 에 so 패키지 cp 를 넣 습 니 다.b.명령 행 에서 so 패키지 의 path 를 정의 합 니 다.
export LD_LIBRARY_PATH=/**/*/** (so     )

현재 셸 에서 만 유효 합 니 다.
System.loadLibrary("stockocr"); 

so 파일 의 전체 이름 은 libstockocr.so 입 니 다.Liux 에서 load 를 내 릴 때 lib 와 so 를 제거 해 야 합 니 다.

좋은 웹페이지 즐겨찾기