2014-02-23 2 views
1

간단한 질문이 있지만 대답을 찾을 수 없습니다./ Java 프로젝트에서 어셈블러 라이브러리를 만들고 호출하려면 어떻게해야합니까? 나는 이런 식으로 뭔가가 만든 라이브러리를 호출 발견 : 그래서 승리에 7 64 비트를 그것을 할 방법을 알아낼 어차피 리눅스를 기반으로 라이브러리를 만들자바 프로젝트에 asm 라이브러리를 추가하는 방법은 무엇입니까?

public class Hello { 
    public static void main(String[] args) { 
      System.out.println("start"); 

      System.loadLibrary("native"); 
      (new Hello()).nativeCode(); 

      System.out.println("stop"); 
    } 

    public native void nativeCode(); 

}

하지만 솔루션을. 아이디어가 있으십니까? 조언 주셔서 감사합니다.

+0

cdecl 호출 규칙을 준수하는 JNI-comliant 함수를 사용하여 어셈블리에 DLL을 빌드하십시오. Visual Studio는 "masm"사용자 지정을 활성화하면 여기에서 도움을 줄 수 있습니다. –

답변

2

Java의 원시 코드 호출은 JNI을 사용하여 수행됩니다. native 키워드를 사용하여 선언 된 메소드가 포함 된 Java 클래스를 작성해야하며 네이티브 라이브러리에는 JVM이 호출 할 수있는 적절한 이름과 매개 변수가있는 해당 함수를 포함해야합니다.

JVM에서 호출하는 네이티브 함수는 C 헤더 jni.h에 정의 된 형식의 인수를 사용하므로 동일한 헤더에 선언 된 C 함수를 호출하여 JVM과 상호 작용할 수 있습니다. JVM과 어셈블러 코드 사이의 중개자 역할을하는 자신의 C (또는 C++) 코드.

실제로 네이티브 라이브러리를 빌드하는 방법에 대한 자세한 내용은 플랫폼에 따라 다르지만 Java에는 관련되지 않습니다. Windows에서 Java의 System.loadLibrary()은 일반 DLL 파일 만로드합니다. 컴파일러/어셈블러 문서는 빌드 방법에 대한 정보를 제공해야합니다.

+0

[JNA] (http://en.wikipedia.org/wiki/Java_Native_Access)는 어떨까요? 더 나아지지 않을까요? 나는 그들에 대한 어떤 경험도 가지고 있지 않다. 나는 단지 호기심을 가지고있다. ... – Katona

+0

@Katona, 나는 JNA를 사용하지 않았으며, 지금까지도 들어 본 적이 없다. Java 형식을 네이티브 형식에 매핑하는 것처럼 보이므로 Java에서 명시 적으로 작성되지 않은 네이티브 함수를 호출 할 때 도움이됩니다. 그러나 효율성을 희생해야합니다. 예를 들어, 문자열을 원시 함수로 전달하는 것은 원시 힙에 복사하여 프로세스의 변환을 JNI 함수를 호출하는 원시 코드가 아닌 C 스타일 문자열로 변환하는 것입니다. Java 힙에있는 문자 데이터에 직접 액세스하십시오. – Wyzard

관련 문제