1

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: エラー: '->' のベース オペランドに非ポインター型 '_JNIEnv' があります make[1]: * [出力/.../obj/SHARED_LIBRARIES/libdrvb_intermediates/jtest.o] エラー 1

なんでこんなの?アプリと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 は、JNI の処理にプレーンな C を使用するか C++ を使用するかを気にしません。

ここでは、JNI に C++ を使用する方法について簡単に紹介します。

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

于 2013-01-24T08:53:43.427 に答える