First, we have entity class Message.
package jnitest;
public class Message {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class with native method
package jnitest;
public class Client {
public native Message getMessageFromMessage(Message message);
static{
System.loadLibrary("jnitest");
}
public static void main(String[] args) {
Client client = new Client();
client.testObject();
}
public void testObject(){
Message message1 = new Message();
message1.setId(1);
message1.setName("name1");
Message message2 = getMessageFromMessage(message1);
System.out.println("message1.id: " + message1.getId());
System.out.println("message1.name: " + message1.getName());
System.out.println("message2.id: " + message2.getId());
System.out.println("message2.name: " + message2.getName());
}
}
generate head file
javac src/main/java/jnitest/*.java -d target/classes/
javah -classpath target/classes -d target/jni jnitest.Client
head file
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnitest_Client */
#ifndef _Included_jnitest_Client
#define _Included_jnitest_Client
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jnitest_Client
* Method: getMessageFromMessage
* Signature: (Ljnitest/Message;)Ljnitest/Message;
*/
JNIEXPORT jobject JNICALL Java_jnitest_Client_getMessageFromMessage
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif
jnitest_Client.c
# include "jnitest_Client.h"
#include <stdio.h>
/*
* Class: jnitest_Client
* Method: getMessageFromMessage
* Signature: (Ljnitest/Message;)Ljnitest/Message;
*/
JNIEXPORT jobject JNICALL Java_jnitest_Client_getMessageFromMessage
(JNIEnv * env, jobject client, jobject message1) {
//jclass class_message1 = (*env)->GetObjectClass(env, message1);
jclass class_message1 = (*env)->FindClass(env, "jnitest/Message");
jmethodID method_Messsage_getId = (*env)->GetMethodID(env, class_message1, "getId", "()I");
jint jint_message1_id = (*env)->CallIntMethod(env, message1, method_Messsage_getId);
int int_message1_id = (int)jint_message1_id;
printf("int_message1_id =%d\n",int_message1_id);
jmethodID method_Message_getName = (*env)->GetMethodID(env, class_message1, "getName", "()Ljava/lang/String;");
jstring jstring_message1_name = (jstring)(*env)->CallObjectMethod(env, message1, method_Message_getName);
const char *str = (*env)->GetStringUTFChars(env, jstring_message1_name, 0);
printf("jstring_message1_name get %s \n",str);
jmethodID method_Messsage_getAge = (*env)->GetMethodID(env, class_message1, "getAge", "()I");
jint jint_message1_age = (*env)->CallIntMethod(env, message1, method_Messsage_getAge);
int int_message1_age = (int)jint_message1_age;
printf("int_message1_age =%d\n",int_message1_age);
// begin return
jclass class_message2 = (*env)->FindClass(env, "jnitest/Message");
jmethodID method_class_constructor = (*env)->GetMethodID(env, class_message2, "<init>", "()V");
jobject object_message2 = (*env)->NewObject(env, class_message2, method_class_constructor);
jmethodID method_Messsage_setId = (*env)->GetMethodID(env, class_message2, "setId", "(I)V");
if (method_Messsage_setId == NULL || method_Messsage_setId == 0) {
printf ("method_Messsage_setId is null\n");
} else {
printf ("method_Messsage_setId is not null\n");
jint jint_message2_id = (jint)2;
//(*env)->CallVoidMethod(env, object_message2, method_Messsage_setId, jint_message2_id);
}
char message1_newName[] = "This is another message";
jstring jstring_message1_newName = (*env) ->NewStringUTF(env, message1_newName);
jmethodID method_Messsage_setName = (*env)->GetMethodID(env, class_message2, "setName", "(Ljava/lang/String;)V");
(*env)->CallVoidMethod(env, object_message2, method_Messsage_setName, jstring_message1_newName);
//jfieldID id = (*env)->GetFieldID(env, client->);
return object_message2;
}
gcc -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -fPIC -shared -o libjnitest.so src/jnitest_Client.c