Jni: new Object in c

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值