1

测试.c

#include <string.h>
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>

jstring Java_com_test_b_hello_hellostr( JNIEnv* env,jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

这个编译没问题。但是当我更改为 test.cpp 时,编译有错误。

libb/jtest.cpp:在函数 '_jstring* Java_com_test_b_hello_hellostr(JNIEnv*, _jobject*)' 中:jtest.cpp:108:错误:'->' 的基本操作数具有非指针类型 '_JNIEnv' make[1]: * [out/.../obj/SHARED_LIBRARIES/libdrvb_intermediates/jtest.o] 错误 1

为什么会这样?app和c有区别吗?

我检查系统 jni.h 文件:alps\dalvik\libnativehelper\include\nativehelper\jni.h .

.
    void        (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);
    jstring     (*NewStringUTF)(JNIEnv*, const char*);
    jsize       (*GetStringUTFLength)(JNIEnv*, jstring);
...
    jstring NewStringUTF(const char* bytes)
    { return functions->NewStringUTF(this, bytes); }
.....
4

1 回答 1

2

C++ 的 JNI 与普通 C 的 JNI 略有不同。

在普通的 C 中,使用是正确的:(*env)->SomeFunction(env, arg, arg, ...)

请注意,您必须取消引用env,并且该函数的第一个参数始终是env.

在 C++ 中,情况有所不同。你用: env->SomeFunction(arg, arg, ...)

您不需要取消引用env,也不会env作为第一个参数传递。

对 Java 的实际调用将是相同的。Java 不关心你是使用纯 C 还是 C++ 来做 JNI 的东西。

这是使用 C++ 进行 JNI 的快速介绍。

http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/cpp.html

于 2013-01-24T08:53:43.427 回答