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