左司马 2020-07-09 11:17 采纳率: 0%
浏览 279

JNI 返回对象,Java调用native方法报NullPointerException,求大牛指教

Java调用native方法报错
Exception in thread "main" java.lang.NullPointerException
at com.company.jni.extract.SwExtract.extractSw(Native Method)

java:

class Result {
            private int errorCode;
            public Map<String, Integer> mapResult;
    }

public class SwExtract {
            public static native Result extractSw(String fileName, List<int[]> listPoints);

            public static void main(String[] args) {
                                //入参赋值
                                //XXXXX
                                Result cResult = extractSw(fileName, listPoints);
                }

}

JNI:

JNIEXPORT jobject JNICALL Java_com_company_jni_extract_SwExtract_extractSw
(JNIEnv * env, jclass jcls, jstring jstrFilePath, jobject jobLists)
{

    // 前面的处理逻辑已省略,tExtractResult结构数据可用
    jclass rstClass = env->FindClass("com/company/jni/extract/Result");  // 搜索类
    jmethodID initFunID = env->GetMethodID(rstClass, "<init>", "()V");   // 获取构造函数
    jobject objResult = env->NewObject(rstClass, initFunID);                // 创建一个类的实例

    jfieldID strId = env->GetFieldID(rstClass, "errorCode", "I");
    env->SetIntField(objResult, strId, nExtractRet);

    jfieldID clsMapId = env->GetFieldID(rstClass, "mapResult", "Ljava/util/Map;");
    jclass clsMap = env->FindClass("java/util/Map");
    jmethodID mapConstructMethod = env->GetMethodID(clsMap, "<init>", "()V");

    jobject objMap = env->NewObject(clsMap, mapConstructMethod, "");
    jmethodID hmapPutMethod = env->GetMethodID(clsMap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

    for (size_t i = 0; i < n; i++)
    {
            int nWeight = tExtractResult->tExtractData[i].nWeight;

            env->CallObjectMethod(objMap, hmapPutMethod, env->NewStringUTF((char*)tExtractResult->tExtractData[i].szResult),nWeight);

}
    env->SetObjectField(objResult, clsMapId, objMap);

    env->DeleteLocalRef(objMap);  //删除局部引用

    return objResult;

}
  • 写回答

1条回答 默认 最新

  • 泡视界 2020-07-09 17:10
    关注

    空指针调用啊,就是你extractSw(fileName, listPoints);有参数为空指针
    解决办法:方法1.检查调用这个native函数的地方,修改以确保有非空的对象作为参数传入
    方法2.加保护,在这个函数外边加上if(xxx!= null && xxx != null) {extractSw(fileName, listPoints);}

    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c