利用JNI进行对象操作

回忆一下JNI的实现步骤:

     1.编写native声明的JAVA类;

     2.使用javac命令编译所编写的java类;

     3.使用Javah生成JNI头文件.h;

     4.编写本地方法实现方法;

     5.生成动态库;(如果方法实现是cpp写的话就一定要用g++来编译)

     6.在java中调用。

    下面的一个例子是C\C++与Java之间进行对象的操作。

1.创建Student类

/*  * FileName:Student.java  * Description:Class Student  * */ package pojo;

public class Student {   private int id;       private String name;      public Student(){}      public Student(int _id,String _name)      {       this.id=_id;       this.name=_name;      }      public void setId(int _id)      {       this.id=_id;      }      public void setName(String _name)      {       this.name=_name;      }      public int getId()      {       return id;      }      public String getName()      {       return name;      }      public String toString()      {       return "Name:"+name+" id:"+id;      } }

2.创建主调类

/*  * FileName:JniMain.java  * Description:Main class  * */ package pojo;

public class JniMain {

 static{    System.loadLibrary("studentbean");   }   public static native void sayHello();   public native int getId();   public native void setId(int i);   public native void setName(String _name);  public native Student getStudent();  public static void main(String[] args) {   // TODO Auto-generated method stub    JniMain test=new JniMain();   test.setId(101);   test.setName("Rose");   Student tmp=test.getStudent();   System.out.println("Id:"+tmp.getId());   System.out.println("Name:"+tmp.getName());   test.sayHello();  }

}

3.编译java,生成.h 

sudo javac pojo/JniMain.java pojo/Student.java

javah -classpath . -jni pojo.JniMain

4.根据.h文件写函数实现 

创建pojo_JniMain.cpp

#include"pojo_JniMain.h" #include <iostream> #include <stdio.h> using namespace std; int id=1; jobject student; jstring name; JNIEXPORT void JNICALL Java_pojo_JniMain_sayHello   (JNIEnv *evn, jclass cla) {  printf("shit~\n"); } JNIEXPORT jint JNICALL Java_pojo_JniMain_getId   (JNIEnv *evn, jobject thiz) {  return id; } JNIEXPORT void JNICALL Java_pojo_JniMain_setId   (JNIEnv *evn, jobject thiz, jint ji) {  id=ji; } JNIEXPORT void JNICALL Java_pojo_JniMain_setName   (JNIEnv *env, jobject thiz, jstring _name) {  //name=env->GetStringUTFChars(_name, 0);  jclass studentClass = env->FindClass("pojo/Student");      jmethodID studentMethod = env->GetMethodID(studentClass,"<init>","()V");      jfieldID mId = env->GetFieldID(studentClass,"id","I");      jfieldID mstudentName = env->GetFieldID(studentClass,"name","Ljava/lang/String;");       jobject studentObject = env->NewObject(studentClass,studentMethod);      env->SetObjectField(studentObject,mstudentName,_name);      env->SetIntField(studentObject,mId,id);     student = studentObject; } JNIEXPORT jobject JNICALL Java_pojo_JniMain_getStudent   (JNIEnv *env, jobject thiz) {  return student; }

5.编译动态库 

sudo g++ -shared -I /usr/local/lib/jdk1.6.0_29/include/ -I /usr/local/lib/jdk1.6.0_29/include/linux/ pojo_JniMain.cpp -o libstudentbean.so

6.运行 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值