我把NDK里的hello-jni示例文件的hello-jni.c改成hello-jni.cpp,Android.mk里也改成
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.cppinclude $(BUILD_SHARED_LIBRARY)结果编译总提示
make: *** No rule to make target `jni/hello-jni.c', needed by `obj/local/armeabi/objs-debug/hello-jni/hello-jni.o'.  Stop.
为什么它会去找hello-jni.c而不是hello-jni.cpp?

解决方案 »

  1.   

    NDK/ndk-build clean 先清除已编译过的dllLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := hello-jni
    LOCAL_SRC_FILES := hello-jni.cpp
    LOCAL_CFLAGS := -fexceptions
    include $(BUILD_SHARED_LIBRARY)
      

  2.   

    NDK/ndk-build clean 先清除已编译过的dll
    错了 先清除.so
      

  3.   

    删除掉obj文件夹再编译也可以
      

  4.   


    谢谢,这个方法管用。
    但出了个新问题,但出了新问题,一模一样的代码,hello-jni.c的时候可以正常编译,hello-jni.cpp就编译不通过,提示如下,这是怎么了?D:/android-ndk-r6/samples/hello-jni/jni/hello-jni.cpp: In function '_jstring* Ja
    va_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*, _jobject*)':
    D:/android-ndk-r6/samples/hello-jni/jni/hello-jni.cpp:33: error: base operand of
     '->' has non-pointer type '_JNIEnv'
    make: *** [/cygdrive/d/android-ndk-r6/samples/hello-jni/obj/local/armeabi/objs-d
    ebug/hello-jni/hello-jni.o] 错误 1
      

  5.   

    出现错误的原因可能是这样:.C文件是C编译的,.cpp文件是C++编译的。两者在JNI中有一点区别,主要体现在下面的例子中
    C:    (*env)->FindClss(env,"java/lang/String;");
    C++:  env->FindClass("java/lang/String;");
    也就是说C和C++在使用env的时候有一个是用到指针(姑且这样理解吧)