2012-04-02 5 views
3

Java 기본 액세스에 대해 읽었으며 지금까지 Java에서 C 함수를 성공적으로 호출 할 수있었습니다.JNA를 사용하여 C에서 Java 함수 호출

반대의 방법이 있습니까? 인터넷 검색은 많이 도움이되지 못했습니다.

+1

JNI를 사용하면 두 가지 방법을 모두 사용할 수 있습니다. 나는 JNA를 모른다. – Vincent

+0

가능합니다. 내 대답을 참조하십시오 – grep

답변

-1

이 JNA 작동하지 않습니다, JNI를 사용하는 대신 http://en.wikipedia.org/wiki/Java_Native_Interface

+1

잘못된 것을 볼 수 있습니다. JNA로 가능합니다. 나는 그것을 시험해 보았다. – diarmuid

+0

관심있는 사람이 있다면 Java/C 코드를 가져라. 기본적으로 C에서 포인터를 작동시킨 다음 JNAerator가 모든 마법을 수행한다. – diarmuid

1

JNI 라이브러리를 사용하여 start the JVM and call functions in Java from C처럼 보입니다. 이게 너 니 뒤에 오는거야?

+0

기본적으로 JNA를 사용하여 할 수있는 방법이 있는지 알고 싶습니다. 나는 JNI와 함께 시험해 보았고 작동한다. 이것은 JNA를 탐구하는 재미와 같습니다. –

+0

예. JNA를 사용할 수 있습니다. 내 예 : – grep

+0

http://stackoverflow.com/a/34788835/2590960 – grep

5

오프 과정을 수행 할 수 있습니다! 간단한 예를 만들어 보겠습니다.

헤더 파일 header.h을 만들어 보겠습니다. 콜백의 경우 callbackTriger 메서드를 사용합니다. getDeviceRandomStatus 및 randNum은 무작위 데이터 응답을 생성하는 데 도움이되는 메소드입니다. 테스트 라이브러리 방법에 대한

#ifndef HEADER_H_INCLUDED 
#define HEADER_H_INCLUDED 

typedef void(*NotificationListener)(char *, int); 

void callbackTriger(const NotificationListener l); 

void getDeviceRandomStatus(char *answer, int sizeOfChars); 

int randNum(int min, int max); 

#endif // HEADER_H_INCLUDED 

header.c

#include<stdio.h> 
#include "header.h" 
#include <stdlib.h> 
#include <time.h> 

void callbackTriger(const NotificationListener l){ 
    int size=randNum(1,20); 
    char answer[size]; 
    getDeviceRandomStatus(answer, size); 
    (*l)(answer, sizeof(answer)); 
} 

void getDeviceRandomStatus(char *answer, int sizeOfChars){ 
    int i; 
    for(i=0; i<sizeOfChars; i++){ 
     int i=randNum(0,255); 
     answer[i]=i+'0'; 
    } 
} 


int randNum(int min, int max){ 
    srand (time(NULL)); 
    double scaled = (double)rand()/RAND_MAX; 
    int val=(max - min +1)*scaled + min; 
    return val; 
} 

main.c를 :

cd <path> 
gcc -c -Wall -Werror -fpic header.c 
gcc -shared -o libHeader.so header.o 
gcc main.c -o main -lHeader -L<path> -Wl,-rpath=/home/vq/Desktop 
./main 
,369 :

#include<stdio.h> 
#include <limits.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int sizeOfChars=randNum(1,10); 
    char answer[sizeOfChars]; 
    getDeviceRandomStatus(answer, sizeOfChars); 

    int i; 
    for (i = 0; i < sizeof(answer); ++i){ 
     printf("%d ", answer[i]); 
    } 

    return 0; 
} 

지금 공유 lib 디렉토리를 생성하고 테스트 할 수 있습니다

이제 자바 클래스가 필요합니다! 가자 :

import java.util.Arrays; 
    import java.util.logging.Logger; 

    import com.sun.jna.Callback; 
    import com.sun.jna.Library; 
    import com.sun.jna.Native; 
    import com.sun.jna.Pointer; 

    public class CallBack { 

     public static Logger log = Logger.getLogger(CallBack.class.getSimpleName()); 

     public interface CLibrary extends Library { 

      public interface NotificationListener extends Callback { 
       void invoke(Pointer val, int lenth); 
      } 

      public static class NotificationListenerImpl implements NotificationListener { 
       @Override 
       public void invoke(Pointer val, int lenth) { 
        log.info("returned byte array, size: "+lenth); 
        log.info("java mehtod, callback: " + Arrays.toString(val.getByteArray(0, lenth))); 
       } 
      } 

      public void callbackTriger(NotificationListener callback); 
     } 


     static public void main(String argv[]) { 

      CLibrary clib = (CLibrary) Native.loadLibrary("<path>/libHeader.so", CLibrary.class); 

      // instantiate a callback wrapper instance 
      CLibrary.NotificationListenerImpl callbackImpl = new CLibrary.NotificationListenerImpl(); 

      // pass the callback wrapper to the C library 
      clib.callbackTriger(callbackImpl); 


     } 

    } 
관련 문제