3
A
回答
-1
這並不與JNA工作,使用JNI來代替http://en.wikipedia.org/wiki/Java_Native_Interface
1
看起來像你可以start the JVM and call functions in Java from C,使用JNI庫。這是你在追求什麼?
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測試庫方法:
#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;
}
現在,讓我們創建共享庫並對其進行測試:
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
現在我們需要JAVA類了!走吧:
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);
}
}
相關問題
- 1. JNA函數調用C DLL
- 2. JNA調用C函數
- 3. 從JNA調用libc函數
- 4. 使用JNA從Java調用DLL
- 5. 使用JNI從java調用C函數
- 6. 使用jni從c調用java函數
- 7. 從Java調用c函數
- 8. 從Java調用C++函數
- 9. JNA - 無法從本地函數調用回調函數
- 10. JNA - 從調用DLL
- 11. 巨大的內存佔用量使得使用JNA從Java本地C調用
- 12. JNI vs JNA,從Fortran95調用Java
- 13. Java和JNA的C函數傳遞PARAMS
- 14. 使用SendMessage函數從user32.dll中在Java JNA - 錯誤
- 15. 從C++方法調用Java函數
- 16. 從C#.Net調用Java函數
- 17. 如何從java調用C#函數
- 18. 從Java JNI調用C++函數 - Cocos2d-x
- 19. 如何從c調用Java函數
- 20. 無法從java調用C++函數cocos2dx
- 21. 如何使用JNA將二維數組從Java傳遞到C
- 22. 如何使用unsigned int爲JNA(Java Native Interface)使用函數?
- 23. 使用JSObject從Java調用Javascript函數
- 24. 在Java中使用JNA從源對象(.so)文件中調用C++函數時發生鏈接異常。
- 25. 從C#調用c函數#
- 26. 調用C++函數,從C#
- 27. 從C++調用C#函數?
- 28. 無法調用.net方法從java使用jna?
- 29. 從C++調用R函數,使用Rcpp
- 30. 使用WebKit.NET從JavaScript調用C#函數
使用JNI,你可以兩種方式。我不知道JNA。 – Vincent 2012-04-02 21:17:06
是的,你可以。請參閱我的回答 – grep 2016-01-14 11:46:01