无效参数C++;西格温 我有工作要修改C++中2005中编写的旧DLL。 我已经用gcc、gdb和make安装了eclipseoxygen、cygwin

无效参数C++;西格温 我有工作要修改C++中2005中编写的旧DLL。 我已经用gcc、gdb和make安装了eclipseoxygen、cygwin,c++,eclipse,eclipse-cdt,C++,Eclipse,Eclipse Cdt,我已经搜索了很多地方,对我的项目属性做了很多更改,但我的问题还是在这里:我有5个错误“无效参数” 我的代码: #include <jni.h> #include "core_dll_ModDriver.h" #include <stdio.h> #include <iostream> JNIEXPORT jobjectArray JNICALL Java_core_dll_ModDriver_EtatSupport(JNIEnv * env, jobject

我已经搜索了很多地方,对我的项目属性做了很多更改,但我的问题还是在这里:我有5个错误“无效参数”

我的代码:

#include <jni.h>
#include "core_dll_ModDriver.h"
#include <stdio.h>
#include <iostream>

JNIEXPORT jobjectArray JNICALL Java_core_dll_ModDriver_EtatSupport(JNIEnv * env, jobject o)
{
    const int nbFen = 4;
    const char FAR* name = "EtatSupport";
    char* fen1 = NULL;
    char* fen2 = NULL;
    char* fen3 = NULL;
    char* fen4 = NULL;
    loadDll();
    if ( isDllLoaded() )
    {
        typedef unsigned char ( __stdcall * Function)( char*, char*, char*, char* );
        Function function = (Function)getDllFunction( name );
        if ( function != NULL )
        {
            char error = function ( fen1, fen2, fen3, fen4 );
        }
        else
            std::cout << "echec" << name;
        closeDll();
    }
    jobjectArray result = env->NewObjectArray( nbFen, env->FindClass("java/lang/String"), NULL );
    jstring jfen1 = env->NewStringUTF( fen1 );
    jstring jfen2 = env->NewStringUTF( fen2 );
    jstring jfen3 = env->NewStringUTF( fen3 );
    jstring jfen4 = env->NewStringUTF( fen4 );

    env->SetObjectArrayElement( result, 0, jfen1 );
    env->SetObjectArrayElement( result, 1, jfen2 );
    env->SetObjectArrayElement( result, 2, jfen3 );
    env->SetObjectArrayElement( result, 3, jfen4 );
    return result;
}
#包括
#包括“core_dll_ModDriver.h”
#包括
#包括
JNIEXPORT jobjectArray JNICALL Java_core_dll_ModDriver_EtatSupport(JNIEnv*env,jobject o)
{
const int nbFen=4;
const char FAR*name=“EtatSupport”;
char*fen1=NULL;
char*fen2=NULL;
char*fen3=NULL;
char*fen4=NULL;
loadDll();
if(isdlloaded())
{
typedef无符号字符(u stdcall*函数)(字符*,字符*,字符*);
函数Function=(函数)getDllFunction(名称);
if(函数!=NULL)
{
字符错误=函数(fen1、fen2、fen3、fen4);
}
其他的
std::coutfindclass(“java/lang/String”),NULL);
jstringjfen1=env->NewStringUTF(fen1);
jstringjfen2=env->NewStringUTF(fen2);
jstringjfen3=env->NewStringUTF(fen3);
jstringjfen4=env->NewStringUTF(fen4);
env->SetObjectArrayElement(结果,0,jfen1);
env->SetObjectArrayElement(结果1,jfen2);
env->SetObjectArrayElement(结果2,jfen3);
env->SetObjectArrayElement(结果3,jfen4);
返回结果;
}
我有NewObjectArray和所有SetObjectArray的“无效参数”

第27行无效参数' 候选对象是:_jobjectArray*NewObjectArray(?,_类*,_jobject*)' 第33、34、35、36行无效论点'
候选对象是:void SetObjectArrayElement(_jobjectArray*,?,_jobject*)”

首先要意识到的是,您得到的“无效参数”错误来自Eclipse自己的代码分析,而不是编译器。它实际上不应该阻止您构建或运行代码,它只是一个麻烦

在确定了这一点之后,该错误的原因通常是项目配置的问题,并且可能是特定于平台、Java版本等的(例如,我在Linux上的GCC 6和Java 8代码中没有此类错误)


正如@Msalters在一篇评论中指出的那样,这些错误似乎是由于Eclipse无法解析类型
jsize
。为了研究这一点,我将打开标题
jni.h
(您可以通过#include for it上的“open Declaration”来完成),查找
jsize
的定义,并查看是否有任何东西表明它无法解决问题。若要更正此问题,您可能需要调整项目配置,例如指定其他包含路径或定义其他宏。

请提供错误的确切输出。请尝试Eclipse中的“控制台”视图(例如,您并没有关联的错误行号等)这两个问号恰好是针对
jsize
参数的。有没有可能在其他地方重新定义了
jsize
?新编译器可能更容易违反一个定义规则。另外,请引用真正的错误。我很确定它们不会包含“参数”。添加的错误看起来与Problems视图中的错误类似,这只是一个摘要/简化。其他详细信息(包括编译器的输出和用于g++的命令行选项)将在“控制台”中view.problem solved.my jni.h调用项目不知道的另一个目录中的jni_md.h。我已经修改了该目录的路径并解决了问题。感谢帮助