我将libcurl编译成静态库-libcurl.a。现在我向在jni中调用libcurl.a中的方法。请问如何实现?
JNI C代码:
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include "curl/curl.h"JNIEXPORT jint JNICALL Java_com_curljni_curljni_curjni(JNIEnv *env, jobject this)
{
 CURL *curl;
  curl = curl_easy_init();
  if(curl) {
    curl_easy_cleanup(curl);
return 1;
  }
return 0;
}#MK文件:静态库在local_path目录
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)#LOCAL_C_INCLUDES := $(LOCAL_PATH)

LOCAL_MODULE    := curjniLOCAL_SRC_FILES := curjni.c
#LOCAL_LDFLAGS = $(LOCAL_PATH)/libcurl.a
LOCAL_LDLIBS := -lz -llog -L$(LOCAL_PATH)include $(BUILD_SHARED_LIBRARY)编译错误提示:
$ make APP=curljni2 -B
Android NDK: Building for application 'curljni2'
Compile thumb  : curjni <= apps/curljni2/project/jni/curjni.c
SharedLibrary  : libcurjni.so
out/apps/curljni2//objs/curjni/curjni.o: In function `Java_com_curljni_curljni_c
urjni':
apps/curljni2/project/jni/curjni.c:13: undefined reference to `curl_easy_init'
apps/curljni2/project/jni/curjni.c:21: undefined reference to `curl_easy_cleanup
'
collect2: ld returned 1 exit status
make: *** [out/apps/curljni2//libcurjni.so] Error 1Administrator@Luye /cygdrive/D/NDK

解决方案 »

  1.   

    似乎 curl = curl_easy_init();curl_easy_cleanup(curl); 没有调用到;不知引入了#include "curl/curl.h"没有。
    好像要在mk文件中,配置点东西!
      

  2.   

    undefined reference是连接错误,和引用.h文件没有关系。
    Android.mk中
    LOCAL_LDFLAGS = $(LOCAL_PATH)/xxxx.a这个没有作用吗?
      

  3.   

    我的意思是说,这个错误时link时出错,和是否include 头文件没有关系。
    还是Android.mk文件写的有问题。具体怎么写,你再google一下。
    我找了一下,就是用LOCAL_LDFLAGS。但我没有在我的机器上试。
      

  4.   

    LOCAL_C_INCLUDES += $(LOCAL_PATH)/include $(LOCAL_PATH)/lib $(CURLX_ONES)# This may also need to include $(CURLX_ONES) in order to correctly link
    # if libcurl is changed to be built as a dynamic library
    LOCAL_CFLAGS += $(common_CFLAGS)LOCAL_SRC_FILES := curjni.cpp应该是少了$(CURLX_ONES) ,我再看看那,不过不清楚在上面加,还是在下面的LOCAL_CFLAGS中添加
      

  5.   

    我试了,可以编译通过,生成JNI的.so文件。
    我的Android.mk里面是这样的:
    LOCAL_LDFLAGS := $(LOCAL_PATH)/lib_test.a注意两点:
    1. 是:=, 不是=.
    2. lib_test.a也是交叉编译出来的。请你再试试。
      

  6.   

    应该是我的libcurl.a生成的有问题。
    太烦了,一个编译弄了好久了。。
      

  7.   

    NDK中 apps下本身就有一个例子,two-libs,就是引用静态库。
    LOCAL_PATH:= $(call my-dir)# first lib, which will be built statically
    #
    include $(CLEAR_VARS)LOCAL_MODULE    := libtwolib-first
    LOCAL_SRC_FILES := first.cinclude $(BUILD_STATIC_LIBRARY)# second lib, which will depend on and include the first one
    #
    include $(CLEAR_VARS)LOCAL_MODULE    := libtwolib-second
    LOCAL_SRC_FILES := second.cLOCAL_STATIC_LIBRARIES := libtwolib-firstinclude $(BUILD_SHARED_LIBRARY)
      

  8.   

    也是参考的 twolibs 例子