【问题标题】:Android: Error While Generating .so fileAndroid:生成 .so 文件时出错
【发布时间】:2012-08-06 12:48:40
【问题描述】:

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

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

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

  11. 在命令提示符下转到项目文件夹
  12. <ndkfolder>/ndk-build
  13. 会生成.so文件

但我卡在“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;
}

【问题讨论】:

  • 你能告诉我你的包名和你加载这个库的类的名字吗?
  • 我有三个包 1.com.cts.agentframework 2.com.cts.c2dmclient 3.com.exampleservice .. 在 com.exampleservice 我创建了一个名为 NativeLib.java 的类,只加载lib.. 但我从 com.cts.c2dmclient 调用 NDK fn
  • 你已经在你的 Android.mk 中指定了一个模块名称,对吧?
  • yes 与 .c 文件名相同,即 com_exampleservice_NativeLib

标签: android android-ndk


【解决方案1】:

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

确保com_exampleservice_NativeLib.h 文件确实存在于您的c 文件附近的jni 目录中。

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

  LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

请注意,此 $(LOCAL_C_INCLUDES) 必须是绝对路径列表,而不像 $(LOCAL_SRC_FILES) 那样基于 $(LOCAL_PATH)

另一个注意事项是在您的com_exampleservice_NativeLib.c 文件中使用#include 指令或命名是不正确的。它应该去

#include <stdio.h>
#include <malloc.h>
#include "com_exampleservice_NativeLib.h"

详细解释见What is the difference between #include <filename> and #include "filename"?

【讨论】:

    【解决方案2】:

    我也是第一次使用 NDK。

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

    我发现this 教程很有用:

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2014-10-16
      • 2017-11-14
      • 2015-03-02
      相关资源
      最近更新 更多