[질문]java에서 C++함수 호출에 대한 질문

pat8002의 이미지

안녕하세요..

java에서 (SUSE Linux System)c++함수 호출 시 jni를 사용함에 있어서에 질문입니다...

여러 예제를 보게 되면 생성 되어지는것이 (helloworld를 예를 들면)
HelloWorld.java, HelloWorld.h, HelloWorld.cpp와 같이 자신이 전부 생성하던데..

그 외에 이미 만들어져있는 c++(so파일)안에 함수를 java쪽에서 불러다 쓰고 싶을때는 어떻게 해야 할 지 몰라서요..
이 경우도 위와 같이 HelloWorld.java, HelloWorld.h, HelloWorld.cpp를 만들고
HelloWorld.cpp안에서 다시 이미 만들어져 있는 c++안에 함수를 불러서 쓰도록 해야 하는 건가요?
이렇게 되면 so파일을 재 생성해야 할 거 같은데.. (아닌가..ㅡㅡ;;)

횡설수설한 질문인거 같은데..

간단히 답변 부탁드리겠습니다..

나그네나그네의 이미지

JAVA에서 호출할 수 있는 C나 C++ 함수는 java class내에서 native로 이미 예약되었던 함수만 가능하니까...

만들어진 so파일 내의 함수를 호출하는 것은 gcc 컴파일 시에 -L옵션을 해당 so파일로 설정해주면 가능합니다.

----------------
agidari.wordpress.com

pat8002의 이미지

감사합니다...

그럼 so파일을 재 생성(?) 해야 하는 거군요?

많이 배우고 싶다~!!!나도 유식해 지자....

crimsoncream의 이미지

이미 so 파일은 있으시다고 했으니까 java에서 해당 function을 사용할 수 있도록 adapter 역할을 해줄 class를 정의하셔야 합니다.
작업 순서는

1. adapter class 내에 native method를 선언하시고 compile 하신 후에
2. javah -jni 해주시면 header file이 하나 생길 겁니다.
3. 그 헤더파일에 선언되어 있는 function을 define 하시면서 그 안에서 원하시는 so의 function을 부르시면 됩니다.
4. 3의 function을 so로 만드신 다음, 1의 class를 사용하시기 전에 System.loadLibrary()를 이용해서 loading 해주시고
5. 1의 class의 native method를 부르시면 됩니다. 이때 원래의 그 so는 다시 만드실 필요는 없고 이 시점에서 loading이 가능해야 합니다.(LD_LIBRARY_PATH로 잡아주신다거나...)

당연히 3에서 define 하시는 function의 매개변수는 so의 function에 넘길 매개변수를 충족 시켜야 하고 marshalling도 해주셔야 합니다.

좀 더 쉬운(?) 방법은 JNI FAQ에 보시면 shared stub 이라는 놈이 있습니다.
그 놈을 쓰시면 되는데 문제는 이 녀석이 플랫폼 dependent한 구현이 있어서 포팅이 되있는 시스템이 많지가 않습니다.
i386 linux는 돼있는걸 본거 같은데 googling을 해보시기 바랍니다. 혹시 googling 중에 타 시스템에 포팅된 거 발견하시면 포스팅 좀 해주시고요 :)

=========================================================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

pat8002의 이미지

너무 친절한 글에 작업 방법 까지...
정말로 감사드립니다..많은 도움 됬습니다...
구글링해서 좋은 정보 찾아볼께요...

많이 배우고 싶다~!!!나도 유식해 지자....

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.