자바에서 인라인 어셈블리를 하기 위해서는 자바 JNI를 이용해야 한다.
관련 글 : http://huammmm1.tistory.com/444
-----------------------------------------------------------------------
1. 32bit dll을 이용한 인라인 어셈블리
이제 인라인 어셈블리를 하고자 하는 c함수안에 다음과 같이 작성해보자. (intel syntax)
#include<jni.h>
#include "jni_HelloWorld.h"
#include<stdio.h>
JNIEXPORT jint JNICALL Java_jni_HelloWorld_print(JNIEnv *env, jobject obj)
{
int a=10;
__asm {
mov a, 20
}
return a;
}
a를 10으로 초기화하고, 인라인 어셈블리로 a에 20을 할당하는 간단한 예제이다.
이 c파일을 cl 컴파일러를 사용해 32bit dll로 빌드 한 뒤 실행해보면 20이 출력됨을 확인할 수 있다.
2. 64bit dll을 이용한 인라인 어셈블리
이번에는 같은 c파일을 64bit dll로 빌드해보면 다음과 같은 에러가 발생한다.
'이 아키텍처에서는 '__asm' 키워드를 사용할 수 없습니다.'
MS 컴파일러는 64bit 인라인 어셈블리를 지원하지 않아서(그렇다고 들었다) 발생하는 문제이다.
이 문제를 해결하기 위해서는 MS 컴파일러 대신 gcc 컴파일러를 사용해 64bit dll로 빌드하면 된다.
먼저 64bit dll을 빌드할 수 있는 gcc컴파일러가 필요하다. 나는 mingw-w64를 이용했다.
링크 : http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-mingw_20111220.zip/download
그리고 c파일의 인라인 어셈블리 구문을 수정해주어야 한다. gcc컴파일러로 인라인 어셈블리를 할 때에는 intel
syntax가 아니라 AT&T syntax를 사용해야 하기 떄문이다.
#include<jni.h>
#include "jni_HelloWorld.h"
#include<stdio.h>
JNIEXPORT jint JNICALL Java_jni_HelloWorld_print(JNIEnv *env, jobject obj)
{
int a=10, b=20;
asm("movl %1, %%eax; movl %%eax, %0;" :"=r"(b) :"r"(a) :"%eax");
return b;
}
내 기억이 맞다면 위의 인라인 어셈블리 구문은 a의 값을 b로 mov하라는 구문이다.
이제 다음 두 명령을 통해 64bit dll 파일을 생성할 수 있다.
gcc -m64 -I C:\jdk1.7\include -I C:\jdk1.7\include\win32 -c HelloWorld.c
gcc -shared -o Native.dll HelloWorld.o
참고로 -m64는 64bit으로 dll을 빌드하라는 옵션이라고 한다.
'Java > 공개글' 카테고리의 다른 글
gcc로 빌드한 32bit dll에 대한 UnsatisfiedLinkError 해결법 (0) | 2014.09.01 |
---|---|
java.lang.unsatisfiedlinkerror no in java.library.path (0) | 2014.08.26 |
Can't load IA 32-bit .dll on a AMD 64-bit platform (1) | 2014.07.22 |
이클립스에서 java JNI로 Hello World를 출력해보자 (3) | 2014.07.21 |
[JNI] javah could not find class file (0) | 2014.07.21 |