我现在使用JNI,想实现一个小功能。 
在JAVA中定义了一个字符串 
char[]   x=new   char[3]; 
x[0]='a'; 
x[1]='b'; 
x[2]='c'; 现在我想在C++里面实现两个功能, 
1:读取x的内容并在C++里输出 
2:修改x里的内容为x[0]='x',x[1]='y',x[2]='z'。 //函数格式 
JNIEXPORT   jlong   JNICALL   Java_T1210_Test_test_1x(JNIEnv   *env,   jobject   obj) 
{ jclass   clazz_Native=env-> GetObjectClass(obj); 
                //此处不知道如何读取JAVA中的x[]数据
                // 此处不知道如何设置JAVA中的x[]数据
return   1; 
} 希望高手能帮忙帮我补上这个功能! 
十分感谢!

解决方案 »

  1.   

    我这有个在用的程序,在其中也有怎样处理字符串。供参考#include <jni.h>
    #include "yxc_sap_mdapi_ManipulationDataAPI.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <Winnls.h>
    #include <string.h>
    #include "caddialg.h"extern "C"char*   jstringToWindows(JNIEnv*   env,jstring   jstr   );
    jstring   windowsToJstring(   JNIEnv*   env,   char*   str   );JNIEXPORT jstring JNICALL Java_yxc_sap_mdapi_ManipulationDataAPI_CreateMat(JNIEnv* env, jobject obj, jstring snd){
    char     sndstr[16500];
    SAPHD    hd;
    char     *rcvstr;
    char     *sapmes;
    char     *version;
    char     *retstr;
    char *argv[1];
    char* cha="CreateMat";
        argv[0]=cha;

    /* Connect: Parameters about SAP system, user name and password      */
    /* will be read in configuration file cadrfc.ini.                  */ //argc = argc; /* only for compiler purpose RM600 */ hd=SapVersi(&version);
    //printf("SAP-CAD function library, interface version: %s\n",version);
    //printf("-------------------------------------------------\n");
    //printf("\n"); hd = SapConnc(argv,"","","","","","","",&sapmes); //printf("CONNC --- CPIC-RC=%ld\n",hd.cpicrc);
    //printf("--------------------\n");
    if (hd.cpicrc != 0){
    //printf("Received CPIC-Error: %s\n\n",hd.cpicmes);
    //exit(1);
    strcpy(retstr,hd.cpicmes);
    jstring jstr=windowsToJstring(env,retstr);
    return jstr;
    } char* chs=jstringToWindows(env,snd);
    //printf(chs);
    //printf("\n");
    //char* chars1="13600008          1000    11MPARTtest-1007000                            EA ND001005KP7910S001   活塞连杆总成      KG                                                                     20260    ";
    //printf(chars1);
    //printf("\n");
    //创建物料

    strcpy(sndstr,chs);
    //strcpy(sndstr,"13600008          1000    11MPARTtest-1007000                            EA ND001005KP7910S001   活塞连杆总成      KG                                                                     20260    ");
    hd = SapMatcr("MR",sndstr,&rcvstr,&sapmes); //printf("MATRQ --- CPIC-RC=%ld\n",hd.cpicrc);
    //printf("--------------------\n");
    if (hd.cpicrc == 0) {
    //printf("Sended Data:   %s\n",sndstr);
    //rcvstr[hd.datalen] = 0x0;
    //printf("Received Data: %s\n",rcvstr);
    //sapmes[hd.meslen] = 0x0;
    //printf("Received Message: %s\n\n",sapmes);
    strcpy(retstr,sapmes);
    }
    else {
    //printf("Received CPIC-Error: %s\n\n",hd.cpicmes);
    strcpy(retstr,hd.cpicmes);
    jstring jstr=windowsToJstring(env,retstr);
    return jstr;
    //exit(1);
    }
      
    hd = SapDisco();
    //printf("DISCO --- CPIC-RC=%ld\n",hd.cpicrc);
    //printf("createMat is disconnect!"); jstring jstr=windowsToJstring(env,retstr);
    return jstr;
    }JNIEXPORT jstring JNICALL Java_yxc_sap_mdapi_ManipulationDataAPI_CreateBOM(JNIEnv* env, jobject obj, jstring header, jstring items){
    char     sndstr[16500];
    SAPHD    hd;
    char     *rcvstr;
    char     *sapmes;
    //char     *version;
    char     *retstr;
    char *argv[1];
    char* cha="CreateBOM";
        argv[0]=cha;

    //hd=SapVersi(&version);

    hd = SapConnc(argv,"","","","","","","",&sapmes); if (hd.cpicrc != 0){
    strcpy(retstr,hd.cpicmes);
    jstring jstr=windowsToJstring(env,retstr);
    return jstr;
    } char* chs=jstringToWindows(env,header);

    int   length   =   env->GetStringLength(items);;
    char* items1="";
    if(length>0){
    items1=jstringToWindows(env,items);
    } //新建BOM
    strcpy(sndstr,chs);
    hd = SapBomcr("MP",sndstr,&rcvstr,&sapmes); if (hd.cpicrc != 0) {
    strcpy(retstr,hd.cpicmes);
    jstring jstr=windowsToJstring(env,retstr);
    return jstr;
    }

    strcpy(sndstr,items1);
    hd = SapBomcr("SP",sndstr,&rcvstr,&sapmes); if (hd.cpicrc == 0) {
    strcpy(retstr,sapmes);
    }
    else {
    strcpy(retstr,hd.cpicmes);
    jstring jstr=windowsToJstring(env,retstr);
    return jstr;
    }
      
    hd = SapDisco();

    jstring jstr=windowsToJstring(env,retstr);
    return jstr;
    }///////////////////////////////////////////////////////////////////////////////
    //辅助函数:char*   jstringToWindows(JNIEnv*   env,jstring   jstr);
    //功能:将Java的Unicode字符串转化成本地字符数组;
    ///////////////////////////////////////////////////////////////////////////////
    char*   jstringToWindows(JNIEnv*   env,jstring   jstr   )
    {
        //AFX_MANAGE_STATE(AfxGetStaticModuleState());
        int   length   =   env->GetStringLength(jstr   );
        const   jchar*   jcstr   =   env->GetStringChars(jstr,   0   );
        char*   rtn   =   (char*)malloc(   length*2+1   );
        int   size   =   0;
        size   =   WideCharToMultiByte(   CP_ACP,   0,   (LPCWSTR)jcstr,   length,   rtn, (length*2+1),   NULL,   NULL   );
        if(   size   <=   0   )
            return   NULL;
        env->ReleaseStringChars(jstr,   jcstr   );
        rtn[size]   =   0;
        return   rtn;
    }///////////////////////////////////////////////////////////////////////////////
    //辅助函数:jstring   windowsToJstring(   JNIEnv*   env,   char*   str   )
    //功能:将本地字符数组转化成Java的Unicode字符串;
    ///////////////////////////////////////////////////////////////////////////////
    jstring   windowsToJstring(   JNIEnv*   env,   char*   str   )
    {
        //AFX_MANAGE_STATE(AfxGetStaticModuleState());
        jstring   rtn   =   0;
        int   slen   =   strlen(str);
        wchar_t*   buffer   =   0;
        if(   slen   ==   0   )
            rtn   =   env->NewStringUTF(str);   //UTF   ok   since   empty   string
        else
        {
            int   length   =   MultiByteToWideChar(   CP_ACP,   0,   (LPCSTR)str,   slen,   NULL,   0   );
            buffer   =   (wchar_t*)malloc(   length*2   +   1   );
            if(   MultiByteToWideChar(   CP_ACP,   0,   (LPCSTR)str,   slen,   (LPWSTR)buffer,   length   )   >0   )
                rtn   =   env->NewString(   (jchar*)buffer,   length   );
        }
        if(   buffer   )
          free(   buffer   );
        return   rtn;
    }太长,从中删除了一部分