1

My native function accepts char ** as argument . Will anybody help me how should I pass it using JNI.

my native function protocol - long processInput(const char* str1 , char ** output);

Thanks

4

2 回答 2

1

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

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

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

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

  • 返回值和各个参数的含义。
  • 如果char参数表示字符串,那么参数是什么
    • 字符集,
    • 编码和
    • 长度/终止协议。
  • 调用者期望分配和/或释放什么内存?
  • 被调用者?
  • 如果返回值是某个特殊值,这是否意味着output不相关,在这种情况下,包装器应该抛出 Java 异常还是返回null字符串、null数组或零长度数组?
  • Java 对字符串使用 Unicode。如果字符不能映射到函数使用的字符集会怎样?
于 2013-06-14T20:08:14.473 回答
1

您不能真正直接执行此操作,但您也不能轻松地使用 JNI 调用任意函数名称 - 因此您需要一个简单的本机包装方法。从 Android ndk 分发示例/目录中的 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 获取输入字符串等。

于 2013-06-14T16:36:12.007 回答