Linux下,使用C/C++编写"静态链接库"的一个简单例子

/* test_lib.h */
/* 2005/06/28,a.m. wenxy */


#ifndef _TEST_LIB_H
#define _TEST_LIB_H


int test_fun(int nCount);

#endif


/* end file */
// --------------------------------------------------------------------------------------

/* test_lib.c */
/* 2005/06/28,a.m. wenxy */

#include <stdio.h>
#include <unistd.h>

int test_fun(int nCount)
{
 nCount ++;
 printf("Oh, export from the static lib: test_lib.a/n");
 return nCount;
}


/* end file */

// --------------------------------------------------------------------------------------

# makefile
# 产生静态函数库*.a
# ar rcs my_library.a file1.o file2.o

CC = gcc
BIN = test_lib.a
OBJ = test_lib.o


# -----------------------------
# 产生*.a静态库
# .PHONY : static_lib
$(BIN) : $(OBJ)
 ar -r $(BIN) $(OBJ)
# -----------------------------

# 生成目标文件
test_lib.o : test_lib.c test_lib.h
 $(CC) -c test_lib.c

.PHONY : clean
clean :
 -rm $(OBJ) $(BIN)

# end makefile

// -----------------------------------------------------------------------------------------------

/* main.c */
/* 2005/06/28,a.m. wenxy */


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

/* static lib */
#include "test_lib.h"

/* 静态库里的函数 */
/* extern int test_fun(int nCount); */

int main(int argc, char *argv[])
{
 int nTemp = 0;
 nTemp = test_fun(nTemp);
 printf("%d/n", nTemp);
 
 printf("Run ...... [PID = %d]/n", (int) getpid());
 
 
 return 0;
}


/* end file */

// ---------------------------------------------------------------------------------------------

# make file for application
# 2005/06/28,a.m. wenxy


CC = gcc
BIN = main
OBJ = main.o


$(BIN) : $(OBJ)
 $(CC) -o $(BIN) $(OBJ) test_lib.a
 
main.o : main.c test_lib.h
 $(CC) -c main.c test_lib.a


.PHONY : clean
clean :
 -rm $(OBJ) $(BIN)

# end makefile


<think>嗯,用户想学习如何在安卓平台上使用C/C++编写.so动态链接库。首先,我需要回忆相关的步骤和可能的引用内容。根据之前的引用,比如引用[1]提到新建支持C/C++的Android工程,可能需要先配置开发环境,比如AndroidStudio和NDK。然后,用户需要创建JNI接口,这部分可能涉及到NativeMethod.c中的方法命名规则,如引用[5]中的例子,方法名要符合JNI规范,包括包名、类名和方法名。接下来,配置CMakeLists.txt是关键,因为CMake负责编译C/C++代码生成.so文件。引用[3]提到了添加第三方静态库时的配置,这里可能需要类似的方法来链接自己的代码。用户需要指定源文件,添加头文件路径,以及设置生成动态库的参数。然后,Java层调用本地方法的部分,需要加载生成的.so库,并在Java类中声明native方法。引用[5]中的例子展示了如何从Java调用C函数,返回字符串和进行运算,这可能是一个很好的参考。 交叉编译方面,引用[2]提到了在Linux使用g++编译,但安卓可能需要不同的工具链,比如使用NDK中的clang编译器,并指定目标平台。这时候需要配置CMake的编译选项,比如CMAKE_SYSTEM_NAME和CMAKE_ANDROID_ARCH_ABI,确保生成的.so兼容目标设备。调试和常见问题部分,用户可能会遇到方法名不对应、ABI不匹配或者编译参数错误。引用[4]提到修改编译器命令为gcc -fPIC,这可能与生成位置无关代码有关,确保动态库正确加载。此外,引用[3]中的路径问题也需要提醒用户注意,确保库文件路径正确。 最后,生成相关问题需要考虑用户可能的后续疑问,比如性能优化、不同ABI处理、调试方法,或者如何调用第三方库。这些问题需要结合之前的引用内容,比如引用[2]和[3]提到的第三方库的使用,以及引用[1]中的工程配置步骤。</think>### 安卓平台使用C/C++编写.so动态链接库教程 #### 一、环境准备 1. 安装Android Studio及NDK - 下载NDK并配置路径:`File > Project Structure > SDK Location` - 验证NDK版本:`ndk-build --version` 2. 新建支持C/C++的Android工程 - 勾选`Include C++ Support`选项创建项目[^1] - 生成默认的`CMakeLists.txt`和`native-lib.cpp` #### 二、编写C/C++代码 1. 创建JNI接口头文件 ```c // NativeDemo.h #include <jni.h> JNIEXPORT jstring JNICALL Java_com_example_NativeDemo_helloFromC(JNIEnv*, jobject); ``` 2. 实现C函数 ```cpp // native-lib.cpp #include <jni.h> extern "C" JNIEXPORT jstring JNICALL Java_com_example_NativeDemo_helloFromC(JNIEnv* env, jobject obj) { return env->NewStringUTF("Hello from C"); } ``` #### 三、配置CMake构建 ```cmake # CMakeLists.txt cmake_minimum_required(VERSION 3.10.2) add_library( native-lib SHARED native-lib.cpp ) find_library( log-lib log ) target_link_libraries( native-lib ${log-lib} ) ``` #### 四、Java层调用 ```java // NativeDemo.java public class NativeDemo { static { System.loadLibrary("native-lib"); } public native String helloFromC(); } ``` #### 五、交叉编译配置 ```cmake # 设置目标ABI set(CMAKE_ANDROID_ARCH_ABI armeabi-v7a) # 指定NDK工具链 set(CMAKE_SYSTEM_NAME Android) set(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK_HOME}) ``` #### 六、调试与常见问题 1. **方法签名错误** - 必须严格遵循命名规则:`Java_包名_类名_方法名`[^5] 2. **ABI兼容问题** - 在`build.gradle`中配置支持的ABI: ```groovy android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'arm64-v8a' } } } ``` 3. **编译参数优化** - 添加`-fPIC`参数生成位置无关代码[^4] ```cmake set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值