一、 jni
用jni一个好处就是不用加额外的jar包(例如jna需要加相关的jar包)
C代码中,C接口命名规则: Java_类路径_类名_函数名
jniDemo.cpp
#include <jni.h>
#include "jniDemo.h"
JNIEXPORT jint JNICALL Java_com_example_jnidemo_JniTestLib_Add
(JNIEnv *jenv, jclass jc, jint a, jint b)
{
return a+b;
}
jniDemo.h
/*
* jniDemo.h
*
* Created on: 2016年12月20日
* Author: ly
*/
#ifndef JNIDEMO_H_
#define JNIDEMO_H_
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_com_example_jnidemo_JniTestLib_Add
(JNIEnv *jenv, jclass jc, jint a, jint b);
#ifdef __cplusplus
}
#endif
#endif /* JNIDEMO_H_ */
JniTestLib.java
package com.example.jnidemo;
public class JniTestLib {
static
{
System.loadLibrary("jniDemo");
}
public native static int Add(int a, int b);
}
二、jna1.需要加jna相关的jar包和动态库(jna.jar 和 libjnidispatch.so);
2.需要把C头文件转换成java头文件
jnaDemo.cpp
#include <jni.h>
int add(int a, int b)
{
return a+b;
}
jnaDemo.h#ifndef JNADEMO2_H_
#define JNADEMO2_H_
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
jnaDemo.h 转 TestAdd.java(转换的头文件) 用jna头文件转换工具
package com.example.jnidemo2;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
/**
* JNA Wrapper for library <b>testAdd</b><br>
* This file was autogenerated by <a href="http://jnaerator.googlecode.com/">JNAerator</a>,<br>
* a tool written by <a href="http://ochafik.com/">Olivier Chafik</a> that <a href="http://code.google.com/p/jnaerator/wiki/CreditsAndLicense">uses a few opensource projects.</a>.<br>
* For help, please visit <a href="http://nativelibs4java.googlecode.com/">NativeLibs4Java</a> , <a href="http://rococoa.dev.java.net/">Rococoa</a>, or <a href="http://jna.dev.java.net/">JNA</a>.
*/
public interface TestAdd extends Library {
public static final String JNA_LIBRARY_NAME = "jnidemo2"; //jnidemo2 动态库类名
public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(TestAdd.JNA_LIBRARY_NAME);
public static final TestAdd INSTANCE = (TestAdd)Native.loadLibrary(TestAdd.JNA_LIBRARY_NAME, TestAdd.class);
/**
* Original signature : <code>int add(int, int)</code><br>
* <i>native declaration : line 14</i>
*/
int add(int a, int b);
}