android jni调用静态库,该怎么解决
android jni调用静态库
我将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 := curjni
LOCAL_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 1
Administrator@Luye /cygdrive/D/NDK
------解决方案--------------------
貌似是你的路径错误 2个/,你发现没有 ?在那个mk里面设这的时候注意一下
------解决方案--------------------
似乎 curl = curl_easy_init();curl_easy_cleanup(curl); 没有调用到;
不知引入了#include "curl/curl.h"没有。
好像要在mk文件中,配置点东西!
------解决方案--------------------
undefined reference是连接错误,和引用.h文件没有关系。
Android.mk中
LOCAL_LDFLAGS = $(LOCAL_PATH)/xxxx.a
这个没有作用吗?
------解决方案--------------------
我试了,可以编译通过,生成JNI的.so文件。
我的Android.mk里面是这样的:
LOCAL_LDFLAGS := $(LOCAL_PATH)/lib_test.a
注意两点:
1. 是:=, 不是=.
2. lib_test.a也是交叉编译出来的。
请你再试试。
------解决方案--------------------
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.c
include $(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.c
LOCAL_STATIC_LIBRARIES := libtwolib-first
include $(BUILD_SHARED_LIBRARY)
我将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 := curjni
LOCAL_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 1
Administrator@Luye /cygdrive/D/NDK
------解决方案--------------------
貌似是你的路径错误 2个/,你发现没有 ?在那个mk里面设这的时候注意一下
------解决方案--------------------
似乎 curl = curl_easy_init();curl_easy_cleanup(curl); 没有调用到;
不知引入了#include "curl/curl.h"没有。
好像要在mk文件中,配置点东西!
------解决方案--------------------
undefined reference是连接错误,和引用.h文件没有关系。
Android.mk中
LOCAL_LDFLAGS = $(LOCAL_PATH)/xxxx.a
这个没有作用吗?
------解决方案--------------------
我试了,可以编译通过,生成JNI的.so文件。
我的Android.mk里面是这样的:
LOCAL_LDFLAGS := $(LOCAL_PATH)/lib_test.a
注意两点:
1. 是:=, 不是=.
2. lib_test.a也是交叉编译出来的。
请你再试试。
------解决方案--------------------
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.c
include $(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.c
LOCAL_STATIC_LIBRARIES := libtwolib-first
include $(BUILD_SHARED_LIBRARY)