native本地方法

* JNI 
* 本地方法使用native进行声明,一般使用C语言编写
* 示例:
public class NativeDemo {
  int i;
  public static void main(String args[]) {
    NativeDemo ob = new NativeDemo();
    ob.i = 10;
    System.out.println("This is ob.i before the native method:" +
                       ob.i);
    ob.test(); // call a native method
    System.out.println("This is ob.i after the native method:" +
                       ob.i);
  }
  // declare native method
  public native void test();
  // native方法没有方法体
  // load DLL that contains static method
  static {
    System.loadLibrary("NativeDemo");
  }
}
    * 编译代码,得到NativeDemo.class,然后使用javah.exe生成文件NativeDemo.h。
    * 在test()方法实现中将包含NativeDemo.h
    * 为了生成NativeDemo.h,使用命令:javah -jni NativeDemo,生成的文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeDemo */

#ifndef _Included_NativeDemo
#define _Included_NativeDemo
#ifdef _ _cplusplus
extern "C" {
#endif
/*
 * Class:     NativeDemo
 * Method:    test
 * Signature: ()V
 */

// 将要创建的test()函数的原型,方法名包含Java、类名信息等
JNIEXPORT void JNICALL Java_NativeDemo_test
   (JNIEnv *, jobject);     

#ifdef _ _cplusplus
}
#endif
#endif
    * 编写test()方法的实现代码,NativeDemo.c文件:
/* This file contains the C version of the
   test() method.
*/

// 接口信息
#include <jni.h>
#include "NativeDemo.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *env, jobject obj)
{
  jclass cls;
  jfieldID fid;
  jint i;

  printf("Starting the native method.\n");
  // 获取一个包含有关NativeDemo类信息的C结构
  cls = (*env)->GetObjectClass(env, obj);
  // 返回一个包含与类中名为“i”的域变量有关的信息
  fid = (*env)->GetFieldID(env, cls, "i", "I");

  if(fid == 0) {
    printf("Could not get field id.\n");
    return;
  }
  // 检索域变量的原始值
  i = (*env)->GetIntField(env, obj, fid);
  printf("i = %d\n", i);
  // 保存域变量更新后的值
  (*env)->SetIntField(env, obj, fid, 2*i);
  printf("Ending the native method.\n");
}
    * 进行编译并创建dll。通过c/c++编译器:
                Cl /LD NativeDemo.c
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值