bonnie
bonnie

Reputation: 331

How jni deliver a string array?

How to deliver a string array?

I post the code:

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

System always prompt it has the problem when declare JniHello in gMethods and the parameter is not right.

Upvotes: 0

Views: 1435

Answers (3)

cox
cox

Reputation: 476

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

Upvotes: 1

cox
cox

Reputation: 476

const_cast("(Ljava/lang/jsting)Ljava/lang/jsting;") spell error, should be const_cast("(Ljava/lang/jsting)Ljava/lang/jstring;")

jsting ==> jstring

Upvotes: 1

Pavel Zdenek
Pavel Zdenek

Reputation: 7293

  1. stop using wrong manual names for JNICALL functions. javah will generate it for you correctly. If your Java name is JniHello in class MyHello and your package is com.hello , JNICALL function must be Java_com_hello_MyHello_JniHello. It can't be Hello_Native, you have made it up.
  2. then of course this correct function name must be used in the last member of JNINativeMethod struct
  3. there is no such class as java/lang/jsting. There is not even a java/lang/jstring if i add the missing r for you. You are asked for the JAVA signature, not JNI. So it must be java/lang/String.
  4. ADDED (thanks @EJP): stop using wrong manual strings for JNI signatures and use the output of javap -s instead

Your code has one more problem: when used GetStringUTFChars, you must also call `ReleaseStringUTFChars' before returning, otherwise you have a leak. But you will find this yourself sooner or later.

Upvotes: 2

Related Questions