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;
}