0

如何传递字符串数组?

我发布代码:

xx.cpp

JNIEXPORT jstring JNICALL Hello_Native(JNIEnv *env, jobject obj,jstring string)
{
    const char *str = env->GetStringUTFChars(string, 0);
    return env->NewStringUTF( "Hello from JNI !");
}
static JNINativeMethod gMethods[] = {
   {"JniHello",const_cast<char*>("(Ljava/lang/jsting)Ljava/lang/jsting;"),(void*)Hello_Native}

xx.java

public native static String JniHello(String text);

JniHello声明时系统总是提示有问题gMethods,参数不对。

4

3 回答 3

2
  1. 停止为 JNICALL 函数使用错误的手动名称。javah将为您正确生成它。如果您的 Java 名称JniHello在类中MyHello并且您的包在com.hello,则 JNICALL 函数必须是Java_com_hello_MyHello_JniHello。不可能Hello_Native,你编的。
  2. 那么当然这个正确的函数名必须用在JNINativeMethodstruct的最后一个成员中
  3. 没有这样的类java/lang/jstingjava/lang/jstring如果我为您添加缺少的内容,甚至没有r。您被要求提供 JAVA 签名,而不是 JNI。所以它必须是java/lang/String
  4. 已添加(感谢@EJP):停止对 JNI 签名使用错误的手动字符串并改用 的javap -s输出

您的代码还有一个问题:使用时GetStringUTFChars,您还必须在返回之前调用 `ReleaseStringUTFChars',否则会发生泄漏。但你迟早会发现这一点。

于 2013-01-29T14:17:37.327 回答
1

const_cast("(Ljava/lang/jsting)Ljava/lang/jsting;") 拼写错误,应该是 const_cast("(Ljava/lang/jsting)Ljava/lang/jstring;")

jsting ==> jstring

于 2013-08-31T09:33:00.620 回答
1
Copy some android source code to help you(JNI):


static jobject osNetworkSystem_getHostByNameImpl(JNIEnv* env, jclass clazz,
        jstring nameStr, jboolean preferIPv6Addresses) {

}

static void osNetworkSystem_setInetAddressImpl(JNIEnv* env, jobject obj,
        jobject sender, jbyteArray address) {

}

static jobject osNetworkSystem_inheritedChannelImpl(JNIEnv* env, jobject obj) {

}

/*
 * JNI registration.
 */
static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */
    { "getHostByNameImpl",                 "(Ljava/lang/String;Z)Ljava/net/InetAddress;",                              (void*) osNetworkSystem_getHostByNameImpl                  },
    { "setInetAddressImpl",                "(Ljava/net/InetAddress;[B)V",                                              (void*) osNetworkSystem_setInetAddressImpl                 },
    { "inheritedChannelImpl",              "()Ljava/nio/channels/Channel;",                                            (void*) osNetworkSystem_inheritedChannelImpl               },
};

int register_org_apache_harmony_luni_platform_OSNetworkSystem(JNIEnv* env) {
    return jniRegisterNativeMethods(env,
            "org/apache/harmony/luni/platform/OSNetworkSystem",
            gMethods,
            NELEM(gMethods));
}
于 2013-08-31T09:39:05.913 回答