Java的native方法

Java中有一个native关键字,用来表示本地方法。
那么何为本地方法?本地方法就是用C或者C++写的函数。
当你已经有了一个C函数,可以完成你需要的功能,可以在Java中调用它,而不需要重新写一遍。

public class test{
 public native static void fun();
}
test.fun("message!");

你可以编译这个类,但会报错“UnsatisfiedLinkError”,原因是Java虚拟机找不到这个方法。因此,给JRE提供足够多的信息,使得它可以找到该方法,问题才能解决。
在JDK中需要三步:

  1. 为函数产生一个代码存根,它充当Java和C的中间人,从虚拟机中取出信息传递给已经编译好的C函数。

  2. 创建一个特殊的共享库,从共享库中输出存根代码

  3. 使用System.loadlibrary()的特殊方法,通知JRE从步骤2装载这个库。

编写相应的C函数:使用Java方法的全名,即test.fun。如果该类在一个包中,需要加上包名,如 com.packagename.test.fun。用下划线代替句号,并加上Java_即为Java_com_packagename_test_fun.
之后需要用javah程序产生test.h的头文件,将头文件拷贝到源文件,并提供实现代码。

#include "test.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_packagename_test_fun(JNIEnv* env,jclass cl)
{
    //fun的具体实现,例如:
    printf("message");
}

再编译c 代码到一个动态装载库。
最后添加System.loadlibrary()确保虚拟机首次执行该方法前可以装载这个库。最简单的方法如下:
使用静态代码块的形式

public class test{
    public native static void fun();
    static
    {
        System.loadlibrary();
    }
}

最后执行test.fun();将会输出message.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值