Giu*_*ppe 5 c c++ java android android-ndk
我读了很多例子来检索C/C++代码中的java字符串,但似乎我错过了一些东西.这个简单的代码不起作用..
在ActivityTest(android java代码)我有:
public static native void nativeInit(String stringfromjava);
Run Code Online (Sandbox Code Playgroud)
在TestActivity中,我:
ActivityTest.nativeInit("test");
Run Code Online (Sandbox Code Playgroud)
在我的test-jni.c中:
JNIEXPORT void JNICALL Java_com_test_jni_ActivityTest_nativeInit(JNIEnv* env, jclass cls, jobject obj, jstring stringfromjava){
__android_log_print(ANDROID_LOG_INFO, "TESTJNI","Native Init started");
const char* w_buf = (*env)->GetStringUTFChars(env, stringfromjava, 0);
if(w_buf == NULL) {
__android_log_print(ANDROID_LOG_INFO, "TESTJNI","file path recv nothing");
}
else {
__android_log_print(ANDROID_LOG_INFO, "TESTJNI","String: %s", w_buf);
}
(*env)->ReleaseStringUTFChars(env, stringfromjava, w_buf);
}
Run Code Online (Sandbox Code Playgroud)
但在我的logcat中我只得到:
I/TESTJNI (18921): Native Init started
I/TESTJNI (18921): String:
Run Code Online (Sandbox Code Playgroud)
哪里我错了......?
固定 感谢Mario,从签名中删除"jobject obj"修复了我的问题!
到目前为止只写了一个简短的测试(类似于您的程序),但我的函数有一点不同的签名(可能取决于 SDK/NDK/JDK 版本?从我找到的一些教程代码中获取):
extern "C" void Java_com_whatever_Activity_method(JNIEnv* env, jobject jthis, jstring param);
Run Code Online (Sandbox Code Playgroud)
extern "C"显然,如果您不编写 C++,则不需要。
Java 签名将是:
native void method(String param);
Run Code Online (Sandbox Code Playgroud)
编辑:
获取字符串(不确定这是否 100% 正确,但它有效):
const char *cparam = env->GetStringUTFChars(param, 0);
// .. do something with it
env->ReleaseStringUTFChars(param, cparam);
Run Code Online (Sandbox Code Playgroud)
如果其中有问题,请接受建议。它工作正常,但可能仍然存在一些问题,因此请随时发表评论。
| 归档时间: |
|
| 查看次数: |
4733 次 |
| 最近记录: |