zoukankan      html  css  js  c++  java
  • Jni下NDK开发的bug问题汇总

              前段时间在做Android下jni的部分,遇到了一些bug和错误,找了好久,给整理了一下,留着以后查找方便

    1.c和c++的 mk文件不一样,记着要区分。

    网友给一个比较全的文件有:

    c++正确的mk文件:

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := TestSm3

    LS_CPP=$(subst $(1)/,,$(wildcard $(1)/*.cpp))

    LOCAL_SRC_FILES := $(call LS_CPP,$(LOCAL_PATH))

    include $(BUILD_SHARED_LIBRARY)

    2.就是类型转换的问题

    要把各种数据类型都转化好,这样传入的数据才可以。

    包括jstring 怎么转为char*之类的

    3.还有就是jni下面调用c++中的类还是不一样的。

    要这样来调用。

    image

    Jni中调用c++中的类要这样来调:

    /*

    * 测试SM3的口令算法

    */

    JNIEXPORT jint JNICALL Java_com_test_testndksm3_JniClient_generateOTPWithSM3

      (JNIEnv * env, jclass arg, jobject T0, jobject TC, jobject C, jstring Q, jbyteArray K, jint codeDigits)

      {

      //算法

        CSm3otp *Sm3otp=new CSm3otp;

    Sm3otp->hotpWithKey("E65C4257CB8D9C79747B8E21C82AEBEC","000000005034B136",8);

        return atoi(Sm3otp->computePassword());

      }

    4.这种错误为数据类型不匹配的错误

    JX3@9V6_I(O[UV6]MYQ2ZD5

    记着转换数据类型,包括jstring 和jbyte之间的转换

    clipboard

    --------------------------------------

    当时遇到的几个数据类型的转换,都是无误的,我把代码留下:

    /////////////////
    //jstring to char*
     char* jstringTostring(JNIEnv* env, jstring jstr)
     {        
     char* rtn = NULL;
     jclass clsstring = env->FindClass("java/lang/String");
     jstring strencode = env->NewStringUTF("utf-8");
     jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
     jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
     jsize alen = env->GetArrayLength(barr);
     jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
     if (alen > 0)
     {
     rtn = (char*)malloc(alen + 1);
     memcpy(rtn, ba, alen);
     rtn[alen] = 0;
     }
     env->ReleaseByteArrayElements(barr, ba, 0);
     return rtn;
     }
    ///////////////////////
    
    
    //char* to jstring
    jstring toJstring(JNIEnv* env, const char* pat) { 
      jclass strClass = env->FindClass("java/lang/String"); 
      jmethodID ctorID = 
        env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V"); 
      jbyteArray bytes = env->NewByteArray(strlen(pat)); 
      env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat); 
      jstring encoding = env->NewStringUTF("utf-8"); 
      return (jstring)env->NewObject(strClass, ctorID, bytes, encoding); 
    } 
    
    
    
     /////////////////////////////////////////
  • 相关阅读:
    第四章 利用函数实现指定的功能
    5-7 点到原点的距离(多态)
    5-2 宠物的生长(多态)
    5-7 学生cpp成绩统计
    5-6 学生CPP成绩计算
    php将远程图片下载保存到本地
    vs2010 调试快捷键
    vs2010 快捷键大全
    [C#] 使用Application.AddMessageFilter当做Form的热键
    C# 收发和处理自定义的WINDOWS消息
  • 原文地址:https://www.cnblogs.com/yejiurui/p/2989297.html
Copyright © 2011-2022 走看看