jni compile cpp和c有什么区别?

时间:2013-01-24 08:38:28

标签: java java-native-interface

test.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:错误:' - &gt;'的基本操作数有非指针类型'_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); }
.....

1 个答案:

答案 0 :(得分:2)

JNI for C ++与普通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