1、win10 pch.h文件
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
typedef struct Example3Struct {
int val;
char* name;
} Example3Struct;
typedef struct Example4Struct {
int val;
char* name;
char* add;
} Example4Struct;
EXPORT void example3_sendStruct(const Example3Struct* sval);
EXPORT Example4Struct example4_getStruct(const Example3Struct* sval3);
#endif //PCH_H
pch.cpp
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
#include "iostream"
void example3_sendStruct(const Example3Struct* sval)
{
// note: printfs called from C won't be flushed
// to stdout until the Java process completes
std::cout << sval->val << std::endl;
std::cout << sval->name << std::endl;
}
Example4Struct example4_getStruct(const Example3Struct* sval3)
{
Example4Struct sval4;
sval4.val = 23+sval3->val;
sval4.name = sval3->name;
sval4.add = sval3->name;
return sval4;
}
编译成动态库
java代码 VideoAiLibrary.java
package com.example.demo.jna;
import com.sun.jna.Library;
import com.sun.jna.Structure;
public interface VideoAiLibrary extends Library {
@Structure.FieldOrder({"val", "name"})
public static class Example3Struct extends Structure {
public static class ByReference extends Example3Struct implements Structure.ByReference {
}
public int val;
public String name;
}
@Structure.FieldOrder({"val", "name", "add"})
public static class Example4Struct extends Structure {
public static class ByValue extends Example4Struct implements Structure.ByValue {
}
public int val;
public String name;
public String add;
}
public Example4Struct.ByValue example4_getStruct(Example3Struct.ByReference sval);
// unless otherwise specified, ByReference is assumed - but it can't hurt to be explicit
public void example3_sendStruct(Example3Struct.ByReference sval);
}
java代码 JnaTest.java
package com.example.demo.jna;
import com.sun.jna.Native;
public class JnaTest {
public static void main(String ... args){
final VideoAiLibrary clib = (VideoAiLibrary) Native.load("mycpp11", VideoAiLibrary.class);
final VideoAiLibrary.Example3Struct.ByReference e3ref = new VideoAiLibrary.Example3Struct.ByReference();
e3ref.val = 700;
e3ref.name="朱dddp";
clib.example3_sendStruct(e3ref);
final VideoAiLibrary.Example4Struct.ByValue e4val = clib.example4_getStruct(e3ref);
System.out.println("example 4: " + e4val.val);
System.out.println("example 4: " + e4val.name);
System.out.println("example 4: " + e4val.add);
}
}
linxu只有 pch.h文件有改动
#ifndef PCH_H
#define PCH_H
#ifdef __cplusplus
#ifdef _WIN32
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT extern "C"
#endif
#else
#ifdef _WIN32
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif
#endif
typedef struct Example3Struct {
int val;
char* name;
} Example3Struct;
typedef struct Example4Struct {
int val;
char* name;
char* add;
} Example4Struct;
EXPORT void example3_sendStruct(const Example3Struct* sval);
EXPORT Example4Struct example4_getStruct(const Example3Struct* sval3);
#endif //PCH_H
把百度云盘的代码上传到linux服务器上,先编译c++ 动态库 在运行java代码
# CMakeLists.txt 文件所在路径
cd /aiprogram/cpp/JNA_TEST/
#编译c++ 动态库
bash runcpp.sh
#运行java代码示例
bash runjava.sh
linux 编译和java 代码如下
src 下c++代码,include 下c++的.h头文件,java_code 下java代码
linux代码
通过百度网盘分享的文件:JNA_TESTlinux.zip
链接:https://pan.baidu.com/s/194xIzDgw2YaCmhqUNzA2fA?pwd=ko8m
提取码:ko8m