我用的是Cygwin编译编译文件生成lib*.so文件的。c版本已经会用了。但是c++版本老是通不过;Android.mk 文件:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.cppinclude $(BUILD_SHARED_LIBRARY)
c++源文件没变,只是改变了后缀名  hello-jni.cpp:
#include <string.h>
#include <jni.h>jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}
希望高手指践,我感觉不是在mk文件中设置些什么就是在cPP文件中设置。

解决方案 »

  1.   

    Note that the default extension for C++ source files is '.cpp'. It is
    however possible to specify a different one by defining the variable
    LOCAL_DEFAULT_CPP_EXTENSION. Don't forget the initial dot (i.e. '.cxx'
    will work, but not 'cxx').翻译:
    请注意,C + +源文件的默认扩展名是'的。cpp'。不过,可以通过定义指定一个不同的变量LOCAL_DEFAULT_CPP_EXTENSION之一。不要忘了初始点(即'。CXX来'会的工作,而不是'CXX来')。
    我在mk文件中定义了 LOCAL_DEFAULT_CPP_EXTENSION := .cpp。还是会出错。
      

  2.   

    也许是因为C++编译后, 因为符号和C的不同造成的,可能在C++版本中,需要自己写JNI_OnLoad函数,C版本NDK直接做了java核native代码的关联,因为分析一下符号就很简单的做到了。就拿你这个例子吧, C文件编译后的so文件中,这个函数的链接符号可能叫:
    _Java_com_example_hellojni_HelloJni_stringFromJNI这个和java中的native函数:
    public native String  stringFromJNI();
    就对应起来了, NDK可以自动做。但是C++因为支持函数重载,一般将参数类型也编译生成到符号链接中去了,可能的符号叫:
    _Java_com_example_hellojni_HelloJni_stringFromJNI_JNIEnvXXX_jobjXXX对应不起来, 会有问题。(以上只是我的推断, 一般在运行时出问题, 编译还可以)最好还是将错误贴出来看一下。
      

  3.   

     
    Administrator@oioioi2110 ~
    $ cd $ANDROID_NDK_ROOTAdministrator@oioioi2110 /cygdrive/f/android-ndk-1.6_r1
    $ make APP=hello-jni
    Android NDK: Building for application 'hello-jni'
    make: *** No rule to make target `apps/hello-jni/project/jni/hello-jni.c', neede
    d by `out/apps/hello-jni//objs/hello-jni/hello-jni.o'.  Stop.
    上面的是修改成的cpp之后的
    ////////////////////////////////////////////////////////////////////////////////下面是源文件c的
    Administrator@oioioi2110 /cygdrive/f/android-ndk-1.6_r1
    $ make APP=hello
    Android NDK: Building for application 'hello'
    Compile thumb  : hello-jni <= apps/hello/project/jni/hello-jni.c
    SharedLibrary  : libhello-jni.so
    Install        : libhello-jni.so => apps/hello/project/libs/armeabiAdministrator@oioioi2110 /cygdrive/f/android-ndk-1.6_r1
    $
      

  4.   

    改成 return env->NewStringUTF("Hello from JNI !");
      

  5.   

    这个正解。C++ 不需要加*env了,其他所有的函数都不需要
      

  6.   

    谢谢 LS的帮助!还有个问题不知道能解决不?我现在做一款跨平台移植的android棋牌网游,现在pc服务器和客户端已经完工,要移植到到android手机上;达到手机客户端与pc客户端(不只是服务器连接通信)正常通信,pk;但是,客户端的加密函数和解密函数都调用了window的内核里的东西,听说android是基于linux内核,那么这样android客户端没法调用需要的内核函数了应该怎么样解决呢?我自己想到的一个方案:
        
       服务器端给手机客户端另一套加密方案
              做一个桥梁中转站,然后这个桥梁不调用window内核里的东东做个加密和解密的函数,这样android和桥梁进行通信,然后桥梁在和服务器同信!!  不知道可行不?还希望高人指教,万分感谢!!!
        
      

  7.   

    相同的加密方法,加密算法是一样的啊。比如在windows下用md5加密,在java里也有md5加密。加密结果是一样的。
      

  8.   

    C++需要用到JNINativeMethod,这个有一个hello-jni的C++版本,参考:http://bbs.chinavideo.org/viewthread.php?tid=10870&page=1&extra=#pid43348