JNI 与 JNR 实现代码上的差异

JNI 样例

Java:文件

  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 ();  

     }  

C语言头文件

#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

 

C语言实现

#include<iostream>

#include"com_paxos_jni_TestNativeCode.h"

 

JNIEXPORT voidJNICALL Java_com_paxos_jni_TestNativeCode_testJNI

  (JNIEnv *, jobject){

    //实现逻辑

cout<<"Hello World"<<endl; 

  }

 

JNR样例

Java:文件

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();

    }

}

 

C语言头文件

#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__

 

C语言实现

#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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值