■ サンプル
環境
* OS : CentOS7 * Java : JDK 1.8.0_133 * JNA : Version 4.4.0
C側
Sample.c#include <stdio.h>
#include <stdlib.h>
typedef struct
{
long id;
char* name;
int age;
} Person;
int getPerson(Person** person)
{
*person = (Person *) malloc (sizeof(Person *));
(*person)->id = 1;
(*person)->name = "Mike";
(*person)->age = 23;
return 0;
}
int freePerson(Person** targetPerson)
{
Person *person = *targetPerson;
free(person);
return 0;
}
「gcc -fPIC -shared -o libSample.so Sample.c」でコンパイルする Java側
ISample.javaimport com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.PointerByReference;
public interface ISample extends Library {
// インスタンス生成
ISample INSTANCE = (ISample) Native.loadLibrary("/home/admin/workspace/Demo/etc/libSample.so", ISample.class);
int getPerson(PointerByReference result);
int freePerson(PointerByReference people);
}
Person.java import java.util.Arrays; import java.util.List; import com.sun.jna.Pointer; import com.sun.jna.Structure; public class Person extends Structure implements Structure.ByReference { public long id; public String name; public int age; public Person() { } public Person(Pointer pointer) { super(pointer); read(); } @Override protected List<String> getFieldOrder() { return Arrays.asList("id", "name", "age"); } }Main.java
import com.sun.jna.Pointer;
import com.sun.jna.ptr.PointerByReference;
public class Main {
public static void main(String[] args) {
ISample sample = ISample.INSTANCE;
PointerByReference result = new PointerByReference();
int resultCode = sample.getPerson(result);
Pointer resultPointer = result.getValue();
Person person = new Person(resultPointer);
System.out.println("[Java Code] resultCode = " + resultCode);
System.out.println("[Java Code] ID = " + person.id);
System.out.println("[Java Code] Name = " + person.name);
System.out.println("[Java Code] Age = " + person.age);
resultCode = sample.freePerson(result);
System.out.println("[Java Code] resultCode = " + resultCode);
System.out.println("[Java Code] DONE!!");
}
}
出力結果
[Java Code] resultCode = 0 [Java Code] ID = 1 [Java Code] Name = Mike [Java Code] Age = 23 [Java Code] resultCode = 0 [Java Code] DONE!!
参考文献
http://www.atmarkit.co.jp/fjava/special/jna/jna_3.htmlhttp://jnaexamples.blogspot.jp/2012/03/java-native-access-is-easy-way-to.html