Java 기본 액세스에 대해 읽었으며 지금까지 Java에서 C 함수를 성공적으로 호출 할 수있었습니다.JNA를 사용하여 C에서 Java 함수 호출
반대의 방법이 있습니까? 인터넷 검색은 많이 도움이되지 못했습니다.
Java 기본 액세스에 대해 읽었으며 지금까지 Java에서 C 함수를 성공적으로 호출 할 수있었습니다.JNA를 사용하여 C에서 Java 함수 호출
반대의 방법이 있습니까? 인터넷 검색은 많이 도움이되지 못했습니다.
이 JNA 작동하지 않습니다, JNI를 사용하는 대신 http://en.wikipedia.org/wiki/Java_Native_Interface
JNI 라이브러리를 사용하여 start the JVM and call functions in Java from C처럼 보입니다. 이게 너 니 뒤에 오는거야?
오프 과정을 수행 할 수 있습니다! 간단한 예를 만들어 보겠습니다.
헤더 파일 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);
}
}
JNI를 사용하면 두 가지 방법을 모두 사용할 수 있습니다. 나는 JNA를 모른다. – Vincent
가능합니다. 내 대답을 참조하십시오 – grep