(1)C++代码
typedef int (*CB_OnServiceUserMessage)(uint32_t cid, uint32_t uid, const std::string& data);
extern "C"
{
void init(CB_OnMsg cb_OnMsg)
{
(*cb_OnMsg)();
std::cout << "Initializing..." << std::endl;
}
void start()
{
std::cout << "Start up!" << std::endl;
}
void stop()
{
std::cout << "Shut down!" << std::endl;
}
void send(char* msg)
{
std::cout << msg << std::endl;
}
}
(2)Java代码
PluginProxy.java
import java.io.IOException;
import java.lang.management.ManagementFactory;
import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class PluginProxy
{
private static String libPath;
private interface LibPluginProxy extends Library
{
static LibPluginProxy INSTANCE = (LibPluginProxy) Native.loadLibrary(libPath, LibPluginProxy.class);
public void init(Callback callback);
public void start();
public void stop();
public void send(String msg);
}
public static void main(String[] args) throws Exception {
libPath = "libPluginProxy.so";
LibPluginProxy.INSTANCE.init(new CB_OnMsg());
System.out.println("in main function.");
//add shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
Native.unregister(LibPluginProxy.class);
System.out.println("stop..");
LibPluginProxy.INSTANCE.stop();
String n = ManagementFactory.getRuntimeMXBean().getName();
if (n == null) return;
String pid = n.substring(0, n.indexOf("@"));
if (pid == null) return;
try
{
Runtime.getRuntime().exec("kill -9 " + pid);
}
catch (IOException e)
{
e.printStackTrace();
}
System.exit(-1);
}
}));
Thread t = new Thread(new Runnable() {
@Override
public void run() {
LibPluginProxy.INSTANCE.start();
System.out.println("started in thread..");
}
});
t.start();
System.out.println("started!!");
}
}
CB_OnMsg.java
import com.sun.jna.Callback;
public class CB_OnMsg implements Callback {
// 应用创建
public final int onMsg() {
System.out.println("CB_OnMsg, in function onMsg.");
return 0;
}
}
(3)编译C++的.so共享库
编写makefile,细节忽略,只提供最主要的command,如下:
g++ -shared -o libplugin.so -fPIC -Wall -ggdb -D_REENTRANT -DHAVE_EPOLL -DXML_NULL -DSTATUS_NEWPROTOCOL -Wl,-rpath,../bin
#注:此段有多余的flags,有待修改...
(4)生成Java的JAR包
在eclipse中生成JAR包,linux生成JAR命令请Google......
(5)运行JAR包调用.so共享库
在linux下输入命令:
java -cp jna-3.3.0.jar:ss.jar SalmonProxy
分享到:
相关推荐
一个将C++头文件转JAVA JNA接口类的工具类,方便java程序调用C++ DLL的接口
详细演示了如何通过JNA实现以下形式的动态链接库接口: 1:基本数据类型 2:基本数据类型的指针和引用 3:结构体 4:结构体的指针和引用 5:函数指针和回调函数 6:字符串指针 ...JNA调用本地动态链接库;
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与...
在此编了一个利用jna在java平台下调用c语言动态链接库的例子,c++代码也已经提供,java代码已经调试通过。
java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包
学习java调用c++时用到的JNA包,分享出来和大家一起学习
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与...
JNA 调用dll jna调用 c++
jna 的jar包,JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。
java 通过jna调用c++ 推理方法 用c++ 做pytorch torch script 推理
C++转Java工具,对于研究jni开发很有帮助
JAVA 利用JNA调用C程序32位或者64位dll 实例,直接解压运行。
java调用C#封装的dll(jna,com)java调用C#封装的dll(jna,com)java调用C#封装的dll(jna,com)
一个java通过jna调用C++ dll库的列子,包括C++dll中含回调函数,回调java方法
这几天搞搞JNA,主要是组内小弟靠不住。 找了下资料,居然没有回调函数的样例,郁闷的我不行,于是就自己折腾一晚上,自己实现一个。 C++部分使用ACE实现了一个线程,线程中调用Java部分的回调函数。 C++使用vc8...
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与...
JNA提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java...
JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与...
经过几天的奋战,终于让我搞懂了JNA的解析以及指针在结构体中的应用!!!下了很多的资料,里面包含c++的.h头文件,给需要帮助的人看看!! 里面包含代码以及解析过程。