java本地方法 从java程序中调用c函数

HelloNative.java
class HelloNative{
   public static native void greeting();
}



本地方法既可以是静态的也可以是非静态的
为了实现本地代码,需要编写一个相应的c函数,必须完全按照java虚拟机预期的那样来命名这个函数
规则:
1.使用完整的方法名,比如 HelloNative.greeting
2.如果类属于某一个包,那么在前面添加包名,比如   com.test.HelloNative.greeting
3.用下划线替换掉所有的 . 号,并且加上java_ 前缀   例如 :java_HelloNative_greeting   java_com_test_HelloNative_greeting
4.如果类名含有非ASCII 的字母或数字   如:'_' , '$' 或是大于 ‘\u007F’的Unicode 的字符,用_0xxxx 来替代他们,xxxx 是该字符的Unicode值的4个十六进制数序列
5.如果你重载本地方法,也就是说,你用相同的名字提供多个本地方法,那么,必须在名称后附加两个下划线,后面再加上已编码的参数类型
例如:  有一个本地方法 greeting  和 另一个 greeting(int  repeat)  ,那么第一个称为 java_HelloNative_greeting__   第二个称为  java_com_test_HelloNative_greeting__I
运行
运行javah 实用程序 ,他能自动生成函数名
javac HelloNative.java
javah HelloNative
  //这条命令会产生一个头文件


HelloNative.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */


#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloNative
 * Method:    greeting
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv *, jclass);


#ifdef __cplusplus
}
#endif
#endif


现在,需要将函数原型从头文件复制到源文件,并且给出函数的实现代码


HelloNative.c
#include "HelloNative.h"
#include <stdio.h>


JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env, jclass cl){
printf("Hello, Native World!\n");
}


将本地C代码编译到一个动态装载库中,具体方法依赖于编译器。
linux Gnu C 编译器
gcc -fPIC -I jdk/include -I jdk/include/linux -shared -o libHelloNative.so HelloNative.c
windows 下 微软编译器
cl -I jdk\include -I jdk\include\win32 -LD HelloNative.c -FehelloNative.dll


这里jdk是含有JDK的目录


最后,我们要在程序中添加一个对 System.loadLibrary 方法的调用。
HelloNativeTest.java
Class HelloNativeTest{
  public static void main(String[] args){
    HelloNative.greeting(); 
  }


   static{
System.loadLibrary("HelloNative");   
   }
}




实现步骤
1.在java类中生命一个本地方法
2.运行javah已获得包含该方法的c声明的头文件
3.用c实现该本地方法
4.用代码置于共享类库中
5.在java程序中加载该类库


java.lang.System 1.0 
void loadLibrary(String libname)
装载类库的名字,该库位于库搜索路径中,定位的确切方法依赖于操作系统
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值