JNI学习1--传递java对象 demo

时间:2022-06-28 04:00:45

1.首先创建HelloWorld.Java文件:

[java]  view plain  copy
  1. class Person {  
  2.     public String name;  
  3.     public int age;  
  4.     public boolean student;  
  5.     Person(String name, int age, boolean student){  
  6.             this.name = name;  
  7.             this.age = age;  
  8.             this.student = student;  
  9.     }  
  10.     public String getName()  
  11.     {  
  12.         return this.name;  
  13.     }  
  14.     public void setName(String name){  
  15.         this.name = name;     
  16.     }  
  17.     public int getAge(){  
  18.         return this.age;  
  19.     }  
  20.     public void setAge(int age){  
  21.         this.age = age;  
  22.     }  
  23.       
  24.     public boolean getStudent(){  
  25.         return this.student;  
  26.     }  
  27.     public void setStudent(boolean student){  
  28.         this.student = student;  
  29.     }  
  30. }  
  31. public class HelloWorld {  
  32.     public native void displayHelloWorld();  
  33.     public native void displayPerson(Person p);  
  34.     static{  
  35.         System.loadLibrary("hello");  
  36.     }  
  37.     public static void main(String[] args){  
  38.         new HelloWorld().displayHelloWorld();  
  39.         Person p = new Person("hc"19true);  
  40.         p.setAge(23);  
  41.         new HelloWorld().displayPerson(p);  
  42.           
  43.     }  
  44. }  
 

2.在命令行中编译java文件:

javac HelloWorld.java

编译生成.h文件:

javah HelloWorld

生成HelloWorld.h文件。

3.在vc++6.0或者vs中创建dll工程,并将生成的HelloWorld.h文件引入。

4.创建c++的Person类

Person.h:

[cpp]  view plain  copy
  1. #include <string>  
  2. using namespace std;  
  3. class Person{  
  4.     public:  
  5.             string name;  
  6.             int age;  
  7.             bool student;  
  8.     public:  
  9.             Person();  
  10.             Person(string name, int age, bool student);  
  11.             string toString();  
  12.             virtual ~Person();  
  13. };  
 

Person.cpp

[cpp]  view plain  copy
  1. #include "Person.h"  
  2. Person::Person()  
  3. {  
  4. }  
  5. Person::Person(string name, int age, bool student):name(name), age(age), student(student){  
  6. }  
  7. string Person::toString(){  
  8.     string str = "name:" + this->name;  
  9.     return str;  
  10. }  
  11. Person::~Person()  
  12. {  
  13. }  
 

5.实现HelloWorld.cpp:

[cpp]  view plain  copy
  1. #include "jni.h"  
  2. #include "HelloWorld.h"  
  3. #include "Person.h"  
  4. #include <iostream>  
  5. using namespace std;  
  6. JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){  
  7.     cout << "Hello World!" << endl;  
  8. }  
  9. JNIEXPORT void JNICALL Java_HelloWorld_displayPerson(JNIEnv *env, jobject obj1, jobject obj){  
  10.     Person *p = new Person();  
  11.     jclass cls = (env)->GetObjectClass(obj);  
  12.     jfieldID name = env->GetFieldID(cls, "name""Ljava/lang/String;");  
  13.     jstring str1 = (jstring)env->GetObjectField(obj, name);  
  14.     jboolean c = '1';  
  15.     string str = env->GetStringUTFChars(str1, &c);  
  16.       
  17.     jfieldID age = env->GetFieldID(cls, "age""I");  
  18.     p->name = str;  
  19.     p->age = env->GetIntField(obj, age);  
  20. //  p->student = obj.student;  
  21.     cout << p->toString() << " age:" << p->age << endl;  
  22. }  
 

6.在工程中导入“JDKpath”/include中的“jni.h”以及“JDKpath”/include/win32中的“jni_md.h”

7.生成dll,并将dll放入java工程的目录里

8.运行java

Java HelloWorld

总结:传递java对象,对象的各个属性需要与jni提供的类型进行转换然后再赋值给c++的对象,还是比较麻烦的,不知道有没有更好的方法。。。