代码之家  ›  专栏  ›  技术社区  ›  DSOI__UNUNOCTIUM

GetByteArrayElements未在此范围内声明

  •  0
  • DSOI__UNUNOCTIUM  · 技术社区  · 5 年前

    我试图用C++在Java中创建一个本机方法。但是,我的g++编译器一直告诉我,我的GetByteArrayElements函数没有声明。我已经将jni.h和相应的头文件都包含到了我的类中,我不知道哪里出了问题。请帮帮我。

    我试着改变论点,看看这是不是问题所在。不是,把 env 在前面没用。

    #include<algorithm>
    #include<string>
    #include<vector>
    #include<jni.h>
    #include"com_package_name_ClassName.h"
    #define apnd push_back
    #define nperm std::next_permutation
    typedef std::vector<std::string> slist;
    JNIEXPORT jbyteArray JNICALL Java_com_package_name_ClassName_permute(JNIEnv*env,jclass cls,jbyteArray ba)
    {
        bool cp=false;
        jbyte*bt=GetByteArrayElements(*ba,&cp);
        std::string str=std::string((char*)bt,env->GetArrayLength(ba));
        std::string*ps=new std::string(),tmp=str;
        slist*perms=new slist();
        perms->apnd(str);
        nperm(tmp.begin(),tmp.end());
        while(tmp!=str)
        {
            perms->apnd(tmp);
            nperm(tmp.begin(),tmp.end());
        }
        for(unsigned int i=0;i<perms->size();*ps+=*perms[i]+(i+1==perms->size()?"":"\n"),i++);
        jbyteArray r=env->NewByteArray(ps->size());
        env->SetByteArrayRegion(r,0,ps->size(),reinterpret_cast<const char*>(ps->c_str()));
        return r;
    }
    

    头文件

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_package_name_ClassName */
    
    #ifndef _Included_com_package_name_ClassName
    #define _Included_com_package_name_ClassName
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_package_name_ClassName
     * Method:    permute
     * Signature: ([B)[B
     */
    JNIEXPORT jbyteArray JNICALL Java_com_package_name_ClassName_permute
      (JNIEnv *, jclass, jbyteArray);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Remy Lebeau    5 年前

    GetByteArrayElements() 不是一个独立的函数,就像您的代码试图将其用作。它实际上是 JNIEnv 给你的东西,就像 GetArrayLength() , NewByteArray() ,和 SetByteArrayRegion() 成员是。拜托 read the JNI documentation .

    你还泄漏了你分配的所有内存。不用了 new 总之,让编译器为您管理所有内存。访问完Java字节数组的元素后,需要释放它。

    改为尝试类似的操作:

    #include <algorithm>
    #include <string>
    #include <vector>
    #include <jni.h>
    #include "com_package_name_ClassName.h"
    
    #define apnd push_back
    #define nperm std::next_permutation
    typedef std::vector<std::string> slist;
    
    JNIEXPORT jbyteArray JNICALL Java_com_package_name_ClassName_permute(JNIEnv *env, jclass cls, jbyteArray ba)
    {
        jbyte *bt = env->GetByteArrayElements(ba, NULL);
        if (!bt) return NULL;
        std::string str(reinterpret_cast<char*>(bt), env->GetArrayLength(ba));
        env->ReleaseByteArrayElements(ba, bt, 0);
        std::string tmp = str;
        slist perms;
        do {
            perms.apnd(tmp);
            nperm(tmp.begin(), tmp.end());
        }
        while (tmp != str);
        std::string ps = perms[0];
        for(size_t i = 1; i < perms.size(); ++i) {
            ps += ("\n" + perms[i]);
        }
        jbyteArray r = env->NewByteArray(ps.size());
        if (r) {
            env->SetByteArrayRegion(r, 0, ps.size(), reinterpret_cast<const jbyte*>(ps.c_str()));
        }
        return r;
    }
    
        2
  •  1
  •   SolidMercury    5 年前

    应该是

    对于c: jbyte*bt = (*env)->GetByteArrayElements(env,ba,&cp);

    对于c++: jbyte*bt = env->GetByteArrayElements(ba,&cp);