2012-08-06 79 views
0

我是Android新手,正在尝试创建一个简单的SDK + NDK概念。我跟着下面的步骤:Android:生成.so文件时出错

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

    LOCAL_PATH:= $(叫我-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; 
} 
+0

放入您的Native-C文件。 – Dharmendra 2012-08-06 13:37:45

+0

我添加了我的c文件 – Sudarshan 2012-08-06 13:40:22

+0

你能告诉我你的包名和你正在加载这个lib的类的名字吗? – Dharmendra 2012-08-06 13:44:03

回答

0

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"?的详细说明。

0

我刚刚被使用NDK的第1次为好。

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

我发现this教程有用: