packageclass com_paxos_jni;
public class TestNativeCode{
//定义一个本地方法
public native void testJNI();
public static void main(String[] args){
//调用动态链接库
System.loadLibrary("TestNativeCode");
TestNativeCode testNativeCode= new TestNativeCode ();
testNativeCode. testJNI ();
}
#include<jni.h>
/* Header forclass com_paxos_jni_TestNativeCode */
#ifndef_Included_com_paxos_jni_TestNativeCode
#define_Included_com_paxos_jni_TestNativeCode
#ifdef__cplusplus
extern"C" {
#endif
/*
* Class: com_paxos_jni_TestNativeCode
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT voidJNICALL Java_com_paxos_jni_TestNativeCode_testJNI
(JNIEnv *, jobject);
#ifdef__cplusplus
}
#endif
#endif
#include<iostream>
#include"com_paxos_jni_TestNativeCode.h"
JNIEXPORT voidJNICALL Java_com_paxos_jni_TestNativeCode_testJNI
(JNIEnv *, jobject){
//实现逻辑
cout<<"Hello World"<<endl;
}
package com.paxos.jni;
import jnr.ffi.LibraryLoader;
public class Test {
publicstatic interface MathTest {
voidsayHello();
}
publicstatic void main(String[] args) {
MathTest libc = LibraryLoader.create(MathTest.class).load("nativeCode2");
libc.sayHello();
}
}
#ifndef__MAIN_H__
#define__MAIN_H__
#include<windows.h>
/* To use this exported function of dll, includethis header
* inyour project.
*/
#ifdefBUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef__cplusplus
extern"C" //这里必须写明编译类型,否者报错
{
#endif
__declspec(dllexport)void __stdcall sayHello();
#ifdef__cplusplus
}
#endif
#endif// __MAIN_H__
#include"main.h"
#include<iostream>
usingnamespace std;
void sayHello ()
{
cout<<"Hello World"<<endl;
}
1. 不需要特别的生成对应的jni接口,省去生成头文件的麻烦。
2. jnr开发人员可以不具备C语言能力,直接调用。
3. 使用JNI技术,不仅可以实现Java访问C函数,也可以实现C语言调用Java代码。
4. Jnr引入的第三方jar包使用更简便。
1. 如果不涉及到C与JAVA互相调用场景,推荐jnr,否者相反。
2. 当对内存和效率要求高的时候,还是要推荐使用jni.