无法创建共享库静态内 [英] Can't create shared library with static inside

查看:153
本文介绍了无法创建共享库静态内的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请帮我寻找扔整个互联网,但我无法找到答案......

ç层

我创建了简单的函数 INT平均值(INT,INT); ,并将其放置在 calc_mean.h ,并在初始化的 calc_mean.c 这里有这个两个文件。

calc_mean.c

 的#includecalc_mean.h

INT平均值(INT A,INT B)
{
返回(A + B)/ 2;
}
 

calc_mean.h

  INT平均值(INT,INT);
 

然后,我创建使文件,并建立档案使用名为Test_Archive.a(.a)中的文件做出如下文件

生成文件

  GCC:= C:\工具\ NDK工具链\ NDK,独立\ BIN \ ARM-Linux的androideabi-gcc.exe
GPP:= C:\工具\ NDK工具链\ NDK,独立\ BIN \ ARM-Linux的androideabi-G ++ EXE
AR:= C:\工具\ NDK工具链\ NDK,独立\ BIN \ ARM-Linux的androideabi-ar.exe

默认:所有

所有:OBJ
    $(AR)R Test_Archive.a *的.o

OBJ:
    $(GPP)-C的* .c
 

我得到的 Test_Archive.a 存档文件。现在,我想这个存档文件添加到JNI和呼叫从我的JNI的项目意味着功能,为我创造了JNI和Java文件,你可以看到下面。


JAVA层

你怎么能在这里的Java层看到我有TestJavaClass具有一个本地方法叫做 JMean 这种方法有两个 INT 参数和返回同样 INT

 公共类TestJavaClass
{
    / **默认的构造函数
     *
     * /
    公共TestJavaClass(){

    }

    / **测试功能。
     *
     * @参数一
     * @参数b
     * @返回
     * /
    公共本地INT JMean(INT A,INT B);
}
 


JNI层

这是JNI头文件

Test_Library.h

  / *勿编辑这个文件 - 这是机器生成* /
#包括< jni.h>
/ *头类com_Fido_OSTXLib_OSTX * /

#ifndef的_Included_com_Fido_OSTXLib_OSTX
#定义_Included_com_Fido_OSTXLib_OSTX
的#ifdef __cplusplus
为externC{
#ENDIF

/ *
 *类别:com_Fido_OSTXLib_OSTX
 *方法:JMean
 *签名:(二)我
 * /
JNIEXPORT jint JNICALL Java_com_Fido_OSTXLib_OSTX_JMean
  (JNIEnv的*,jobject,jint,jint);

的#ifdef __cplusplus
}
#ENDIF
#ENDIF
 

Test_Library.c

 的#includeTest_Library.h
#包括calc_mean.h

JNIEXPORT jint JNICALL Java_com_Fido_OSTXLib_OSTX_JMean(JNIEnv的* ENV,jobject THIZ,jint一,jint B)
{
    返回平均值(A,B);
}
 

我把这两个文件的 Test_Library.h Test_Library.c calc_mean.h Test_Archive.a 并创建make文件的 Android.mk

Android.mk

  LOCAL_PATH:= $(叫我-DIR)

包括$(CLEAR_VARS)

LOCAL_MODULE:= Test_Library
LOCAL_SRC_FILES:= Test_Library.c

LOCAL_LDLIBS:= -LTest_Archive.a

包括$(BUILD_SHARED_LIBRARY)
 

但是当我想创建.so文件,会出现以下错误,为什么呢?

  

$ ../../ndk-build编译大拇指:Test_Library< = Test_Library.c   SharedLibrary:libTest_Library.so   C:/cygwin/home/android-ndk-r5b/Fido/ProjectOSTX/obj/local/armeabi/objs/OSTX_Library/OSTX_Library.o:   在功能上 Java_com_Fido_OSTXLib_OSTX_JMean:   C:/cygwin/home/android-ndk-r5b/Fido/ProjectOSTX/jni/OSTX_Library.c:6:   未定义的引用的意思是'collect2:劳工处返回1退出状态化妆: * 的   [/home/android-ndk-r5b/Fido/ProjectOSTX/obj/local/armeabi/libOSTX_Library.so]   错误1

为什么未定义的参考`意思'?

解决方案

当我suppos主要的原因是编译器设置,我做了一些修改,在 生成文件和我。连接到共享库的归档文件,这里有改动。

  GCC:= C:\工具\ NDK工具链\ NDK,独立\ BIN \ ARM-Linux的androideabi-gcc.exe
GPP:= C:\工具\ NDK工具链\ NDK,独立\ BIN \ ARM-Linux的androideabi-G ++ EXE
AR:= C:\工具\ NDK工具链\ NDK,独立\ BIN \ ARM-Linux的androideabi-ar.exe

OPTIONS:= \
-fpic \
-ffunction截面\
-funwind桌\
-fstack保护器\
-D__ARM_ARCH_5__ \
-D__ARM_ARCH_5T__ \
-D__ARM_ARCH_5E__ \
-D__ARM_ARCH_5TE__ \
-Wno-psabi \
-march =结构ARMv5TE \
-mtune =的XScale \
-msoft浮动\
-mthumb \
-Os \
-fomit帧指针\
-fno严格走样\
-finline-上限= 64 \
-DANDROID \
-Wa,\
-O2 \
-DNDEBUG \
-G \

默认:所有


所有:OBJ
    $(AR)R libtestlibrary.a *的.o

OBJ:
    $(GCC)$(OPTIONS)-C的* .c
 

Please help I search throw whole internet but I can't find answer ...

C Layer

I have created simple function int mean(int, int); and place it in calc_mean.h and initialize it in calc_mean.c here are this two files.

calc_mean.c

#include "calc_mean.h"

int mean(int a, int b)  
{  
return (a+b) / 2;  
}  

calc_mean.h

int mean(int, int);

Then I create make file and build archive (.a) file called Test_Archive.a using following make file

makefile

GCC := C:\Tools\ndk-toolchain\ndk-standalone\bin\arm-linux-androideabi-gcc.exe
GPP := C:\Tools\ndk-toolchain\ndk-standalone\bin\arm-linux-androideabi-g++.exe
AR  := C:\Tools\ndk-toolchain\ndk-standalone\bin\arm-linux-androideabi-ar.exe

default: all

all: obj
    $(AR) r Test_Archive.a *.o

obj:
    $(GPP) -c *.c

I get Test_Archive.a archive file. Now I want to add this archive file to JNI and call mean function from my JNI project, for that I have created JNI and Java files which you can see below.


JAVA Layer

How you can see here in java layer I have TestJavaClass that have one native method called JMean this method have two int arguments and return also int.

public class TestJavaClass
{
    /** Default Constructor
     * 
     */
    public TestJavaClass( ) {

    }

    /** Test Function. 
     *  
     * @param a
     * @param b
     * @return
     */
    public native int JMean( int a, int b);
}


JNI Layer

This is JNI header file

Test_Library.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_Fido_OSTXLib_OSTX */

#ifndef _Included_com_Fido_OSTXLib_OSTX
#define _Included_com_Fido_OSTXLib_OSTX
#ifdef __cplusplus
extern "C" {
#endif

/*
 * Class:     com_Fido_OSTXLib_OSTX
 * Method:    JMean
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_Fido_OSTXLib_OSTX_JMean
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

Test_Library.c

#include "Test_Library.h"
#include "calc_mean.h"

JNIEXPORT jint JNICALL Java_com_Fido_OSTXLib_OSTX_JMean( JNIEnv* env, jobject thiz, jint a, jint b )
{
    return mean( a, b );
}

I put this two files Test_Library.h, Test_Library.c and calc_mean.h, Test_Archive.a and create make file Android.mk

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE           := Test_Library
LOCAL_SRC_FILES        := Test_Library.c

LOCAL_LDLIBS := -LTest_Archive.a

include $(BUILD_SHARED_LIBRARY)

but when I want to create .so file, the following error occurs, why ?

$ ../../ndk-build Compile thumb : Test_Library <= Test_Library.c SharedLibrary : libTest_Library.so C:/cygwin/home/android-ndk-r5b/Fido/ProjectOSTX/obj/local/armeabi/objs/OSTX_Library/OSTX_Library.o: In function Java_com_Fido_OSTXLib_OSTX_JMean': C:/cygwin/home/android-ndk-r5b/Fido/ProjectOSTX/jni/OSTX_Library.c:6: undefined reference tomean' collect2: ld returned 1 exit status make: * [/home/android-ndk-r5b/Fido/ProjectOSTX/obj/local/armeabi/libOSTX_Library.so] Error 1

Why undefined reference to `mean' ?

解决方案

As I suppos the main reason was compiler settings, I make some modifications in makefile and my .a archive linked to shared library, here are modifications.

GCC := C:\Tools\ndk-toolchain\ndk-standalone\bin\arm-linux-androideabi-gcc.exe
GPP := C:\Tools\ndk-toolchain\ndk-standalone\bin\arm-linux-androideabi-g++.exe
AR  := C:\Tools\ndk-toolchain\ndk-standalone\bin\arm-linux-androideabi-ar.exe

OPTIONS  :=\
-fpic \
-ffunction-sections \
-funwind-tables  \
-fstack-protector \
-D__ARM_ARCH_5__ \
-D__ARM_ARCH_5T__ \
-D__ARM_ARCH_5E__ \
-D__ARM_ARCH_5TE__ \
-Wno-psabi \
-march=armv5te \
-mtune=xscale \
-msoft-float \
-mthumb \
-Os \
-fomit-frame-pointer \
-fno-strict-aliasing \
-finline-limit=64 \
-DANDROID \
-Wa, \
-O2 \
-DNDEBUG \
-g \

default: all


all: obj
    $(AR) r libtestlibrary.a *.o

obj:
    $(GCC) $(OPTIONS) -c *.c

这篇关于无法创建共享库静态内的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆