linux ndk编译c 项目,NDK16_NDK编译生成so并CMAKE集成

NDK开发汇总

一 Linux环境生成so文件

1 新建源文件

vim main.c

内容

int test(){

return 11;

}

~

2 编译

参考: NDK16_Linux中使用NDK编译安卓可用的.c

配置gcc临时环境变量

export CC=android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

配置头文件临时环境变量

export AAA="--sysroot=/home/bao/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/bao/android-ndk-r17c/sysroot/usr/include -isystem /home/bao/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"

生成so

$CC $AAA -fPIC -shared main.c -o libTest.so

-shared 生成动态库

-static 生成静态库

查看so中方法:

(so拷贝到aarch64-linux-android-nm同路径下)

/home/bao/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-nm libTest.so

1465a67eda1063ce76b07bf372862dfe.png

二 CMAKE集成

AS新建一个新的Android项目include C++ support

Project视图下,项目main文件夹下创建文件路径

jniLibs/armeabi-v7a

将Linux环境生成的libTest.so添加到上述目录

e7c5e7a5a36f7d479ddf852748706462.png

项目自带的native-lib.cpp中调用libTest.so中方法

注意:extern “C”,引入了android/log.h打印调用结果

#include

#include

#include

extern "C" {

extern int test();

};

extern "C" JNIEXPORT jstring

JNICALL

Java_com_example_ray_ndk16_MainActivity_stringFromJNI(

JNIEnv *env,

jobject /* this */) {

std::string hello = "Hello from C++";

__android_log_print(ANDROID_LOG_ERROR,"jni","libTest.so 里面的test方法:%d",test());

return env->NewStringUTF(hello.c_str());

}

配置CMakeLists.txt

指定so库路径

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} L${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a")

链接库

target_link_libraries 添加Test,省略lib和.so (libTest.so →Test)

# 设置一个变量

# CMAKE_CXX_FLAGS C++的参数 会传给编译器

# CMAKE_C_FLAGS C的参数 会传给编译器

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a")

# Specifies libraries CMake should link to your target library. You

# can link multiple libraries, such as libraries you define in this

# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.

native-lib

Test

# Links the target library to the log library

# included in the NDK.

${log-lib} )

也可以这样配置

add_library(Test SHARED IMPORTED)

set_target_properties(Test PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libTest.so)

配置build.gradle 设置支持手机平台: abiFilters “armeabi-v7a”

defaultConfig {

applicationId "com.example.ray.ndk16"

minSdkVersion 17

targetSdkVersion 29

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

externalNativeBuild {

cmake {

cppFlags "-frtti -fexceptions"

abiFilters "armeabi-v7a"

}

}

}

java中加载库:System.loadLibrary(“Test”);

public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.

static {

System.loadLibrary("native-lib");

System.loadLibrary("Test");

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// Example of a call to a native method

TextView tv = (TextView) findViewById(R.id.sample_text);

tv.setText(stringFromJNI());

}

/**

* A native method that is implemented by the 'native-lib' native library,

* which is packaged with this application.

*/

public native String stringFromJNI();

}

运行结果

5e49b2b4f7382b5bce8cc0bf0b9fba3c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值