编译Android下纯C的静态程,如何在android studio中用JNI调用静态库

满意答案

dcebd7a0de6265b6ccae5ead692f1eab.png

webcyq2

2017.04.18

dcebd7a0de6265b6ccae5ead692f1eab.png

采纳率:44%    等级:9

已帮助:1263人

① 动态链接库的生成;

② 在Java和C混合编程的情况下如何调用第三方动态链接库;

③ 使用dlopen程序运行时直接调用;

④ 纯c的方式开发调用;

本文重点推荐②和④,第③中太麻烦每个函数都需要dlsym调用一次;

代码的百度云链接: http://pan.baidu.com/s/1dD3qkQ9 密码:c5s3

工具/原料

Win8.1 x64

adt-bundle-windows-x86_64-20140702

android-ndk-r10d

生成动态库

1

android ndk下面生成动态库so文件的方法很多,但是这里只提供一种方法,更多的生成方法可以看,“ndk 编译静态库”:

http://jingyan.baidu.com/article/63f236280b90690208ab3d12.html

2

fkAdd.c 的内容如下:

#include

int fkAdd(int nX, int nY)

{

returnnX + nY;

}

3

Android.mk 的内容如下:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:= fkAdd

LOCAL_SRC_FILES:= fkAdd.c

include $(BUILD_SHRRED_LIBRARY)

4

1、打开 eclipse

2、点击 文件

3、点击 新建

4、点击 other...

5

1、展开 Android 选项;

2、选择 Android Project from Existing Code;

3、点击 Next

6

1、输入 Root Director;

2、取消 tests;

3、选中 Copy projects into workspace;

4、点击 Finish;

7

1、右键工程;

2、选择 Android Tools;

3、Add Native Support...;

8

点击 Finish

9

修改android sdk 版本为 4.0.3;

关于如何修改 android sdk 版本:

http://jingyan.baidu.com/article/c910274bfdd000cd371d2d4b.html追答: 2

根据“生成动态库”中的过程1到10,新建一个纯c的ndk程序:

“D:\Android\android-ndk-r10\samples\native-activity"

3

把会用的so文件的目录libs拷贝到 jni目录下面

4

修改 Android.mk 文件,内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := fkAdd

LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libfkAdd.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := main

LOCAL_SRC_FILES := main.c

LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM

LOCAL_STATIC_LIBRARIES := android_native_app_glue

LOCAL_SHARED_LIBRARIES := fkAdd

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := native-activity

LOCAL_SRC_FILES := NativeActivity.c

LOCAL_LDLIBS := -llog -landroid

LOCAL_STATIC_LIBRARIES := android_native_app_glue

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

5

增加 NativeActivity.c 文件,添加内容如下:

#include

#include

#include

#include

void android_main(struct android_app* state) {

// Make sure glue isn't stripped.

app_dummy();

void* soAdd = dlopen("/data/data/com.example.native_activity/

lib/libfkAdd.so",RTLD_NOW);

void* soMain = dlopen("/data/data/com.example.native_activity/

lib/libmain.so",RTLD_NOW);

void (*fp_android_main)(struct android_app*) =

(void (*)(struct android_app*))dlsym(soMain,"android_main");

fp_android_main(state);

dlclose(soMain);

dlclose(soAdd);

}

6

在 main.c 文件中添加一行,方便测试:

__android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_input 100 + 200 = [%d] ", fkAdd(100, 200));

7

编译运行,点击手机屏幕后,观察logcat 效果如下:

END

注意事项

c++的函数在写动态链接库的时候,需要注意的是c++的函数会被系统修改,所以做动态库测试的使用最好用c语言

00分享举报

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值