Android:生成.so文件时出错

时间:2012-08-06 12:48:40

标签: android android-ndk

我是Android新手,我正在尝试创建一个简单的SDK + NDK概念。我按照以下步骤操作:

  1. 下载NDK
  2. 解压zip文件
  3. 创建新的android项目。
  4. 在项目下创建新文件夹jni。
  5. 根据需要定义UI。
  6. 创建一个java文件来调用所有本机方法。使用“native”前缀声明所有这些方法。使用system.loadLibrary("")使用静态块加载库。
  7. 使用javah -jni filename
  8. 创建相应的头文件
  9. 将生成的filename.h文件移动到jni文件夹。
  10. 编写包含.h文件的c文件,并在.h文件中实现方法并保存。
  11. 创建mk文件,包含以下内容:

    LOCAL_PATH:= $(致电my-dir)
    包括$(CLEAR_VARS)
    LOCAL_MODULE:=
    LOCAL_SRC_FILES:= .c
    包括$(BUILD_SHARED_LIBRARY)

  12. 转到命令提示符下的项目文件夹
  13. 提供<ndkfolder>/ndk-build
  14. .so文件将生成
  15. 但我陷入了“12”点,并出现以下错误:

    **"Compile thumb : com_cts_c2dmclient_NativeLib <= com_cts_c2dmclient_NativeLib.c
    jni/com_cts_c2dmclient_NativeLib.c:3:40: fatal error: com_cts_c2dmclient_NativeL
    ib: No such file or directory
    compilation terminated.
    make: *** [obj/local/armeabi/objs/com_cts_c2dmclient_NativeLib/com_cts_c2dmclien
    t_NativeLib.o] Error 1**
    

    注意:.h文件已成功创建。

    我的com_exampleservice_NativeLib.c文件

    #include "stdio.h"
    #include "malloc.h"
    #include <com_exampleservice_NativeLib.h>
    
    JNIEXPORT jint JNICALL Java_com_exampleservice_NativeLib_loop
      (JNIEnv * env,jobject obj,jint v1, jint v2){
        int loop;
        unsigned long int *array;
    if(v2 == 0){
        array = (unsigned long int *)malloc(v1 * sizeof(unsigned long int));}
    else if(v2 == 1)
    {
    array = realloc(array,sizeof(array)+v1);
    }
    else{
    }
        array[0] = 1;
        array[1] = 1;
        for (loop = 2; loop < v1; loop++) {
            array[loop] = array[loop - 1] + array[loop - 2];
        }
        for (loop = 0; loop < v1; loop++) {
        }
    if(v2 == 2)
    {
    free(array);
    }
    return 0;
    }
    

2 个答案:

答案 0 :(得分:0)

我刚刚第一次使用NDK。

我使用SWIG来避免必须手动编写Java JNI代码

我发现this教程很有用:

答案 1 :(得分:0)

您的Android.mk文件在您的问题中看起来不太好。

确保{c}文件附近的com_exampleservice_NativeLib.h目录中存在jni文件。

可能需要将目录添加到包含路径,例如

  LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

请注意,此$(LOCAL_C_INCLUDES)必须是绝对路径列表,而不是基于$(LOCAL_SRC_FILES)的{​​{1}}。

另一个注意事项是,在$(LOCAL_PATH)文件中,使用com_exampleservice_NativeLib.c指令ornamenation不正确。应该去

#include

有关详细说明,请参阅What is the difference between #include <filename> and #include "filename"?