Reputation: 331
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
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
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
Reputation: 7293
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.JNINativeMethod
structjava/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
.javap -s
insteadYour 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