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函数
- 2. 从JNA调用libc函数
- 3. 使用jni从c调用java函数
- 4. 从Java调用c函数
- 5. JNA - 无法从本地函数调用回调函数
- 6. JNA - 从调用DLL
- 7. 巨大的内存占用量使得使用JNA从Java本地C调用
- 8. JNI vs JNA,从Fortran95调用Java
- 9. Java和JNA的C函数传递PARAMS
- 10. 如何从c调用Java函数
- 11. 从Java JNI调用C++函数 - Cocos2d-x
- 12. 从C#.Net调用Java函数
- 13. 如何使用unsigned int为JNA(Java Native Interface)使用函数?
- 14. 使用JSObject从Java调用Javascript函数
- 15. 在Java中使用JNA从源对象(.so)文件中调用C++函数时发生链接异常。
- 16. 从C#调用c函数#
- 17. 调用C++函数,从C#
- 18. 使用WebKit.NET从JavaScript调用C#函数
- 19. 使用pybind11从C++调用Python函数
- 20. 从Clojure调用java函数
- 21. 从JavaScript调用Java函数
- 22. 从Java调用oracle函数
- 23. 从Rhino调用Java函数
- 24. 如何使用JNA将int作为Java的C++函数参数传递
- 25. 从C#调用VBA函数
- 26. 从C调用Powershell函数#
- 27. 从C调用libyahoo2函数#
- 28. C++调用从虚函数
- 29. 从C++调用R函数
- 30. 从C调用cuda函数
使用JNI,你可以两种方式。我不知道JNA。 – Vincent 2012-04-02 21:17:06
是的,你可以。请参阅我的回答 – grep 2016-01-14 11:46:01