android - 如何通过 JNi 将 JAVA 对象发送到 C 并将 java 对象值分配给 C 结构?

标签 android java-native-interface

我有一个 JAVA 函数,它通过 JNI 调用 C 函数。 我的 Java 函数:

  char details= 'd';
        char reg_code='r';
        char[] reg_chal ={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x01,0x02,0x03,0x04,0x05,0x06} ;
        char[] aid = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x01,0x02,0x03,0x04,0x05,0x06}; 
        RegisterInfo regInfo = new RegisterInfo( reg_chal,aid);

        res = nativeLib.reg(regInfo, details, reg_code);

现在我的 C 文件包含 JNI 内容.. 实际上我正在将 registerInfo 对象发送到 JNI。 Register Info 类包含一些字符数组。我想将 char 数组的值分配给我的 C 结构:reg_info_t:

#define DEBUG_TAG "NDK_NativeLib"
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, __VA_ARGS__)

typedef struct{

    unsigned char reg_chal[12];
    unsigned char aid[12];
}reg_info_t;

JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_reg(JNIEnv *env,jclass obj,jobject info ,jchar details,jchar reg_code)
    {
        reg_info_t regInfo;
        jclass clazz;
        jfieldID fid;
        jmethodID mid;

        jint status =0; 

          LOGD("NDK:LC: [%s]", "JNI Function call started");

        clazz = (*env)->GetObjectClass(env, info);
        if (0 == clazz)
        {
            printf("GetObjectClass returned 0\n");
            return(-1);
        }

        jstring  reg_chal= (*env)->NewStringUTF(env,regInfo.reg_chal);
        fid = (*env)->GetFieldID(env,clazz,"reg_chal","Ljava/lang/String;");
        (*env)->SetObjectField(env,info,fid,reg_chal);
        LOGD("NDK:LC: [%s]", reg_chal);




         return status; 


}

注册信息.java

public class RegisterInfo {  
   private char[] reg_chal  ;
   private char[] aid; 

   public RegisterInfo(char[] reg_chal,char[] aid) {
        super();         
        this.reg_chal = reg_chal;
        this.aid = aid;
   }
}

现在,当我运行代码时,出现错误:

09-14 10:14:19.536: WARN/dalvikvm(666): **JNI WARNING: illegal start byte 0xf0**
09-14 10:14:19.536: WARN/dalvikvm(666):              string: '�ѯ$ԯ�'
09-14 10:14:19.536: WARN/dalvikvm(666):              in Lcom/marakana/NativeLib;.reg (Lcom/marakana/RegisterInfo;CC)I (NewStringUTF)

我认为我在 stringchar[] 和对象分配之间的转换中犯了一些错误。你能帮我么。提前致谢。

最佳答案

检查此链接中的 char[]

jchar   NewCharArray
        GetCharArrayElements
        GetCharArrayRegion/SetCharArrayRegion
        ReleaseCharArrayElements

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jnistring.html

关于android - 如何通过 JNi 将 JAVA 对象发送到 C 并将 java 对象值分配给 C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7411426/

相关文章:

java - C++ 调用 Java 的 JNI localrefs 的生命周期是多少?

android - 用于Android的Tokio和Reqwest的Rust JNI异步回调

java - 不满意的linkerror aarch64三星银河S6

java - 将原生 uint8_t(Java 字节)转换为 int

java - 如何在 Java 应用程序中嵌入 MySQL 数据库

android - 使用 Volley Android 请求删除

java - 通过另一个类使用 setter 时发生堆栈溢出异常

java - Android logcat 停止中线

java - startActivityForResult 强制关闭我的应用程序

android - 如何在 Android 中以 sleep 模式运行服务