java를 사용해서도 dll을 만들수가 있나요?

zieben의 이미지

java를 사용해서도 dll을 만들수가 있나요?

일반적으로 dll이라는 것이 binary로 된 library라는 것을 생각하면 어떤 언어로 짜도 상관은 없을것 같은데요..

만약에 java로 만들어서 컴파일 된 dll이라면
물론 java소스에서 이 dll을 사용할수가 있겠지요?

제가 궁금한것은 다음과 같습니다.

셈플 툴킷을 구해다가 원하는 내용을 조금 수정해보고 메뉴얼에서 시키는대로 컴파일을 하고 실행을 해 보았습니다.
다음과 같은 에러 메세지가 뜨던데요..

        at com.linar.jintegra.NativeObjRef.init(Native Method) 
        at com.linar.jintegra.NativeObjRef.<init>(Unknown Source) 
        at com.linar.jintegra.Dispatch.createDispatch(Unknown Source) 
        at com.linar.jintegra.Dispatch.<init>(Unknown Source) 
        at opcauto.IOPCAutoServerProxy.<init>(IOPCAutoServerProxy.java:34) 
        at opcauto.OPCServer.<init>(OPCServer.java:111) 
        at OpcAutoClient.main(OpcAUtoClient.java:11) 

뭔가 정의된 lib에서 이상이 있는것 같아서 .jar 파일을 풀어서 decompile 을 해 보았습니다.

        at com.linar.jintegra.NativeObjRef.init(Native Method) 
        at com.linar.jintegra.NativeObjRef.<init>(Unknown Source) 
        at com.linar.jintegra.Dispatch.createDispatch(Unknown Source) 
        at com.linar.jintegra.Dispatch.<init>(Unknown Source) 
이 네 줄은 제가 사용한 툴킷에 lib촐더에 보니 .jar로 압축된 .class 파일들이 존재하던데요..

        at opcauto.IOPCAutoServerProxy.<init>(IOPCAutoServerProxy.java:34) 
        at opcauto.OPCServer.<init>(OPCServer.java:111)  

이 두줄에 나오는 opcauto라는 부분이 제가 사용하는 툴킷의 모든 .jar 파일들의 압축을 다 풀어봐도
그런 이름의 .class파일은 없습니다.
그런데 이 툴킷에서 이 프로그램을 컴파일 할때 dll을 하나 추가해서 컴파일을 하거든요.
그래서 혹시 그 dll이 java로 만들어진게 아닐까 하고 생각하고 있습니다.

제가 생각한 것이 맞나요?

fender의 이미지

zieben wrote:
java를 사용해서도 dll을 만들수가 있나요?

일반적으로 dll이라는 것이 binary로 된 library라는 것을 생각하면 어떤 언어로 짜도 상관은 없을것 같은데요..

만약에 java로 만들어서 컴파일 된 dll이라면
물론 java소스에서 이 dll을 사용할수가 있겠지요?

제가 궁금한것은 다음과 같습니다.

셈플 툴킷을 구해다가 원하는 내용을 조금 수정해보고 메뉴얼에서 시키는대로 컴파일을 하고 실행을 해 보았습니다.
다음과 같은 에러 메세지가 뜨던데요..

        at com.linar.jintegra.NativeObjRef.init(Native Method) 
        at com.linar.jintegra.NativeObjRef.<init>(Unknown Source) 
        at com.linar.jintegra.Dispatch.createDispatch(Unknown Source) 
        at com.linar.jintegra.Dispatch.<init>(Unknown Source) 
        at opcauto.IOPCAutoServerProxy.<init>(IOPCAutoServerProxy.java:34) 
        at opcauto.OPCServer.<init>(OPCServer.java:111) 
        at OpcAutoClient.main(OpcAUtoClient.java:11) 

뭔가 정의된 lib에서 이상이 있는것 같아서 .jar 파일을 풀어서 decompile 을 해 보았습니다.

        at com.linar.jintegra.NativeObjRef.init(Native Method) 
        at com.linar.jintegra.NativeObjRef.<init>(Unknown Source) 
        at com.linar.jintegra.Dispatch.createDispatch(Unknown Source) 
        at com.linar.jintegra.Dispatch.<init>(Unknown Source) 
이 네 줄은 제가 사용한 툴킷에 lib촐더에 보니 .jar로 압축된 .class 파일들이 존재하던데요..

        at opcauto.IOPCAutoServerProxy.<init>(IOPCAutoServerProxy.java:34) 
        at opcauto.OPCServer.<init>(OPCServer.java:111)  

이 두줄에 나오는 opcauto라는 부분이 제가 사용하는 툴킷의 모든 .jar 파일들의 압축을 다 풀어봐도
그런 이름의 .class파일은 없습니다.
그런데 이 툴킷에서 이 프로그램을 컴파일 할때 dll을 하나 추가해서 컴파일을 하거든요.
그래서 혹시 그 dll이 java로 만들어진게 아닐까 하고 생각하고 있습니다.

제가 생각한 것이 맞나요?

자바로 dll을 만드는 것이 불가능한 것은 아니지만 매우 일반적이지 않은 경우 입니다. 주로 gcj나 towerj같은 네이티브 컴파일러를 사용했을 때 그렇게 됩니다만 그런 경우 위와 같은 스택트레이스를 얻기 힘든 것으로 알고 있습니다.

위에서 인용하신 스택트레이스는 윗부분이 짤려 있는데 아마 전체 내용을 보시면 좀 더 원인을 찾기 쉬울 것 같습니다. 스택트레이스를 읽는 방법은 매우 단순합니다. 아래서 부터 윗쪽으로 쭉 읽어 가면 됩니다. 즉,

        at opcauto.IOPCAutoServerProxy.<init>(IOPCAutoServerProxy.java:34) 
        at opcauto.OPCServer.<init>(OPCServer.java:111)  

이 것은 new OPCServer(...)를 호출한 부분에서 OPCServer 생성자의 111번 째 줄이 다시 IOPCAAutoServerProxy라는 클래스를 생성했는데 이 생성자의 34번 째 줄에서 다시 다른 작업을 했음을 의미 합니다.

이런 식으로 쭉 따라 올라가면 맨 마지막에 어떤 예외 상황이 발생했는지 나와 있고 (예를 들어 NullPointerException) 이를 보면 문제의 근본 원인을 짐작할 수 있습니다.

그리고 opcauto는 클래스가 아니라 패키지 입니다. 간단하게 자바의 기본에 대한 책을 훑어보시는 것도 도움이 될 것 같습니다.

----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...

zieben의 이미지

답변 감사드립니다.

프로젝트 기한이 2주정도 남은 상태에서 c++에서 java로 갑자기 요청이 바뀌어서 하도 급한 마음에 기본도 없이 질문을 올렸네요.

덕분에 앞이 깜깜했는데 대충 뭐가 문제인지 찾아볼수 있는 지식은 생겼습니다.

다시한번 감사드립니다.

gamja의 이미지

말씀하시는 내용을 대략 보니

그건 java로 dll을 만든게 아니라

java에서 native code 를 쓰는 것 아닌가요?

다른 언어로 작성되어 컴파일된 native code를 java에서 가져다 쓰는 것 같은데.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.