在JNI中映射char **

时间:2013-06-14 15:44:25

标签: java-native-interface

我的原生函数接受char **作为参数。有人会帮助我如何使用JNI传递它。

我的本​​机函数协议 - long processInput(const char * str1,char ** output);

由于

2 个答案:

答案 0 :(得分:1)

你不能直接这样做,但你不能轻易地用JNI调用任意函数名 - 所以你需要一个简单的本机包装器方法。从Android ndk distribution samples /目录中的hello-jni示例开始,按原样构建以确保一切正常,然后将其更改为:

long processInput(const char* str1 , char ** output);

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    //return (*env)->NewStringUTF(env, "Hello from JNI !");
    char *outputstr; 
    processInput("some input", &outputstr); 
    return (*env)->NewStringUTF(env, outputstr); 
}

您可能还想添加错误检查,也许从jni获取输入字符串等

答案 1 :(得分:1)

这还不是一个完整的答案,但是评论太长了。

首先在Java中编写一个本机函数声明,使其自然适合Java。也许其中一个是合适的:

static native String processInput(String input);
static native byte[] processInput(byte[] input);

然后,为了包装该函数,您必须知道:

  • 返回值和每个参数的含义。
  • 如果char参数代表字符串,那么它们是什么
    • 字符集,
    • 编码和
    • 长度/终止协议。
  • 呼叫者期望分配和/或免费的内存是多少?
  • 被叫者?
  • 如果返回值是某个特殊值,那是否意味着output不相关,在这种情况下,包装器应抛出Java异常或返回null字符串,null数组还是零长度数组?
  • Java将Unicode用于字符串。如果字符无法映射到函数使用的字符集,会发生什么?