자바 호출 dll 또는 so 동적 라 이브 러 리 파일 (c + / c)

5808 단어 일 하 다
java 호출 dll 또는 so 동적 라 이브 러 리 파일 (c + / c) 개발 플랫폼: Eclipse 3.3.1.1 + CDT (cdt - master - 4.0.3) + MinGW (MinGW - 5.1.4)
1: 다음은 자바 호출 dll (C + +)
1: cdt 다운로드 및 설치:http://www.eclipse.org/cdt/downloads.php : eclipse 가 지원 하 는 cdt 플러그 인 을 선택 하여 다운로드 하고
eclipse - > software update - > find and install 로 cdt 설치
2: mingw 다운로드 및 설치:http://sourceforge.net/project/showfiles.php?group_id=2435
그리고 mingw. exe 를 클릭 하여 다운로드 와 설 치 를 선택 하고 모두 선택 합 니 다 (속도 가 느 릴 수 있 으 니 인내심 을 가 져 야 합 니 다).
3: 환경 변수 설정 (시스템 변수 나 사용자 변수 에 다음 변 수 를 추가 하고 경 로 는 실제 설 치 된 것 에 따라 수정 합 니 다):
PATH: D:\Program Files\MinGW\bin
C_INCLUDE_PATH: D:\Program Files\MinGW\include
CPLUS_INCLUDE_PATH: D:\Program Files\MinGW\include\c++\3.4.5;D:\Program Files\MinGW\include\c++\3.4.5\mingw32;D:\Program Files\MinGW\include\c++\3.4.5\backward;D:\Program Files\MinGW\include
[color=red]LIBRARY_PATH: D:\Program Files\MinGW\lib[/color]
[color=red]LIBRARY_PATH 라 는 변 수 를 더 하 는 것 이 좋 습 니 다. 예전 에는 추가 하지 않 았 고 정확 한 dll 을 컴 파일 할 수 있 었 지만 나중에 컴 파일 된 dll 에 문제 가 있 었 습 니 다. 마지막 으로 LIBRARY 를 추가 하지 않 았 습 니 다.PATH 라 는 변 수 는 컴 파일 된 dll 이 제대로 작 동 하지 않 습 니 다.
모든 변 수 를 추가 하면 컴퓨터 를 다시 시작 하 는 것 이 좋 습 니 다.[/color]
4: 관련 설정
eclipse-->Window->Preferences->C/C++->New CDT project wizard->Makefile Project
Binary Parser 를 찾 아 Elf Parser 를 취소 하고 PE Windows Parser 를 선택 하 십시오.
MinGW 디 렉 터 리 에 있 는 make 파일 이름 이 "mingw 32 - make. exe" 이기 때문에 eclipse 기본 호출 파일 이름 은 "Make. exe" 입 니 다.
그래서 MinGW 디 렉 터 리 에 있 는 파일 이름 을 "mingw 32 - make. exe" 로 백업 한 다음 "Make. exe" 로 이름 을 바 꿉 니 다.
5: 자바 프로젝트 와 c + 프로젝트, 아니면 전형 적 인 Hello World 를 예 로 들 면

public class Hello {

public native void sayHello();

static{
System.loadLibrary("Hello");
}


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

그리고 class 파일 생 성 을 컴 파일 하고 명령 javah class 파일 로 헤더 파일 Hello. h 를 생 성 합 니 다.
c + + 프로젝트 생 성:
주의:
1 >: eclipse 에 c + build 모드 설정: release 상 태 를 active 로 변경 하지 않 으 면 자바 프로그램 이 생 성 된 dll 을 호출 하여 다음 과 같은 오 류 를 보고 합 니 다.
Exception in thread "main" java.lang.UnsatisfiedLinkError:
2 >: 컴 파일 할 때 다음 과 같은 오 류 를 보고 하면 해결 방법 은. h 파일 과. cpp 파일 에 int mian () 방법 을 추가 하 는 것 입 니 다.
**** Rebuild of configuration Debug for project HelloC++ ****
**** Internal Builder is used for build ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -oHello.o ..\Hello.cpp
..\Hello.cpp:10:2: warning: no newline at end of file
g++ -LD:\Program Files\Java\jdk1.6.0_10\include\win32 -LD:\Program Files\Java\jdk1.6.0_10\include -oHelloC++.exe Hello.o
D:/Program Files/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmingw32.a(main.o):main.c:(.text+0xbd): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 5192 ms.
------------------------------------------------------------------------------
수 정 된 Hello. h 내용:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class Hello */

#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: sayHello
* Signature: ()V
*/
int main() ;


JNIEXPORT void JNICALL Java_Hello_sayHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

수 정 된 Hello. cpp 내용:
	
#include
#include "Hello.h"
using namespace std;

int main()
{
return 1;
}


JNIEXPORT void JNICALL Java_Hello_sayHello(JNIEnv *, jobject){
printf("Hello world!
");
return ;
}

a: 그리고 eclipse c + + 플러그 인의 make targets - build 로 Hello. o 생 성
아무 거나
make target 마음대로
명령 은 기본 으로 하면 됩 니 다.
b: wingw / bin 의 g + + 를 방금 생 성 된 Hello. o 동급 디 렉 터 리 에 시험 한 다음 명령 줄 에서 Hello. o 가 있 는 디 렉 터 리 로 전환 합 니 다.
명령 실행, 인자 주의 (내 자바 디 렉 터 리 D: \ Program Files \ \ Java \):
g++ -I"D:\Program Files\Java\jdk1.6.0_10\include" -Wl,--add-stdcall-alias -shared -o Hello.dll Hello.o
6: 실행:
방금 생 성 된 dll 파일 을 자바 프로젝트 의 루트 디 렉 터 리 에 복사 하여 Hello. class 를 실행 하면 됩 니 다.
메모: 테스트 클래스 가 어떤 가방 에 있다 면, 예 를 들 어 com. test. Hello, 우리 가 class 파일 을 컴 파일 할 때: javac com \ test \ Hello. java
그리고: javah com. test. Hello, 이렇게 생 성 된 헤더 파일 의 방법 은 호출 될 때 만 찾 을 수 있 습 니 다.
2: 자바 호출 so (C)
자바 와 c / c + + 통신 은 모두 jni 를 통 해 이 루어 집 니 다.자바 코드 에서:
System.loadLibrary("Hello");
Hello 는 Hello. dll 또는 Hello. so 로 쓸 수 없습니다. 시스템 플랫폼 에 따라 자동 으로 채 워 집 니 다. 주의해 야 할 것 은 유 닉 스 / linux 에서. so 동적 라 이브 러 리 파일 을 생 성 할 때 입 니 다.
Hello. so 전에 lib 를 추가 해 야 합 니 다. 그렇지 않 으 면. so 파일 (libHello. so) 을 찾 을 수 없습니다. 실행 할 때. so 경 로 를 지정 해 야 합 니 다.
java - Djva. library. path = / 홈 / user / so 소재 디 렉 터 리 - jar Hello. jar
3: 명령 정리:
c 를 예 로 들 면 (c + + 라면 gcc 를 g + + 로 바 꾸 면 OK):
1: 유 닉 스 / linux 환경 에서
1.1: 파일 생 성. o
gcc -I/usr/lib/j2sdk1.5-ibm/include -fPIC -c example.c
1.2: 동적 라 이브 러 리 생 성. so 파일
gcc -shared -WI -soname example.o -o libexample.so
2: 윈도 우즈 환경 에서
2.1: 파일 생 성. o
gcc -c -I"D:\Program Files\Java\jdk1.6.0_10\include" -I"D:\Program Files\Java\jdk1.6.0_10\include\win32" -o Hello.o Hello.c
2.2: dll 파일 생 성
gcc -I"D:\Program Files\Java\jdk1.6.0_10\include" -Wl,--add-stdcall-alias -shared -o Hello.dll Hello.o
시간 관계 로, 비교적 어 지 럽 게, o (∩ ∩) o...

좋은 웹페이지 즐겨찾기