Android:配置jni环境,java调用jni模块,在Android上部署libcurl.a

文章详细介绍了在Android项目中配置JNI环境的过程,包括创建JNI文件夹、编写Android.mk文件、修改build.gradle文件、使用ndk-build编译cpp代码以及调用JNI方法。此外,还阐述了如何在项目中集成libcurl.a库,涉及修改Android.mk、配置gradle和Application.mk文件,以及在cpp代码中使用curl库。
摘要由CSDN通过智能技术生成

配置jni环境.txt

1 在项目路径中创建JNI文件夹

2 在文件夹中创建一个Android.mk文件 (就是jni所在路径的makefile)

3 在Android.mk中写如下代码
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
#libtestjni.so
LOCAL_MODULE := testjni
LOCAL_SRC_FILES := test.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

4 修改 OBO_170325/app/build.gradle
在这个文件中的 android{}作用域中添加如下代码
sourceSets {
main.jniLibs {
//表示生产的so文件所在路径在什么位置
source {
srcDirs = [‘…/libs’]
}
}
}
externalNativeBuild {
ndkBuild {
//表示构件androidJNI的Android.mk的所在路径
path ‘…/JNI/Android.mk’
}
}

5 进入JNI路径 使用powershell
在JNI中创建一个test.cpp
在里面随便写一个函数

6 在JNI路径下 执行ndk-build.cmd 指令 如果能够生成so 就表示 cpp编译环境成功。

java调用jni模块.txt

1 在src中 跟Activity同一层路径 创建一个 专门调用JNI的类 OBOJNI.class
//专门调用jni C++接口的类
public class OBOJNI {
public static OBOJNI getInstance() {
if (instance == null) {
instance = new OBOJNI();
}
return instance;
}
private static OBOJNI instance = null;
//提供一个调用JNI接口的成员方法
public native void hello_jni();
//加载cpp给提供的 动态库
static {
System.loadLibrary(“testjni”); //libtestjni.so testjni要和Android.mk里面的模块名字是一样的
}
}
在此类中 提供一个native方法 如果方法名是红色的 代码当前方法没有对应的c++声明

2 通过javah工具 给native 方法 制作一个c++对应的声明
打开shell终端
C:\Users\Ace\Documents\GitHub\OBO\OBO_170325\app\src\main\java>
javah -jni com.itcast.ace.obo_170325.OBOJNI

3 找到com_itcast_ace_obo_170325_OBOJNI.h中的对应函数声明 拷贝到 test.cpp中去实现
注意 一定要在extern C {} 中去实现 否则函数名会改变

4 在test.cpp将函数实现
#include <jni.h>
#include <android/log.h>
void testJni_Hello()
{
__android_log_print(ANDROID_LOG_ERROR,“testjni”, “JNI: hello jni”);
return;
}
#ifdef __cplusplus
extern “C” {
#endif
/*

  • Class: com_itcast_ace_obo_170325_OBOJNI
  • Method: hello_jni
  • Signature: ()V
    /
    JNIEXPORT void JNICALL Java_com_itcast_ace_obo_1170325_OBOJNI_hello_1jni
    (JNIEnv * env, jobject obj)
    {
    testJni_Hello();
    }
    /
  • Class: com_itcast_ace_obo_170325_OBOJNI
  • Method: hello_jni2
  • Signature: ()V
    */
    JNIEXPORT void JNICALL Java_com_itcast_ace_obo_1170325_OBOJNI_hello_1jni2
    (JNIEnv *env , jobject obj)
    {
    __android_log_print(ANDROID_LOG_ERROR,“testjni”, “JNI: hello jni2!!!”);
    }
    #ifdef __cplusplus
    }
    #endif

5 重新编译cpp程序
cd C:\Users\Ace\Documents\GitHub\OBO\OBO_170325\JNI>
ndk-build.cmd
生成新的so

6 在java中 Activity中 调用此方法
//调用一个C++方法
OBOJNI.getInstance().hello_jni();

7 如果控制台能够输出cpp的日志 表示代用成功

在Android上部署libcurl.a

1 将对应平台的 libcurl.a 放在JNI文件夹中。
还有curl/整个文件夹(.h头文件) 也放在JNI路径
2 将jni生成的so文件 一起联通libcurl.a一起编译
需要修改Android.mk文件
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)

libcurl.a

LOCAL_MODULE := libcurl
LOCAL_SRC_FILES := libcurl.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)

#libtestjni.so
LOCAL_MODULE := testjni
LOCAL_SRC_FILES := test.cpp login.cpp cJSON.cpp
LOCAL_LDLIBS := -llog
LOCAL_STATIC_LIBRARIES := libcurl
include $(BUILD_SHARED_LIBRARY)

3 修改AndroidStudio配置文件

项目/app/build.gradle
在defaultConfig {}
// 不声明ndk标签,项目默认会创建一个libapp.so的文件
ndk {
// 声明创建so库的文件名,会自动添加lib前缀, 添加了前缀,不会自动添加
moduleName “testjni”
//声明启用Android日志, 在c/c++的源文件中使用的#include <android/log.h> 日志将得到输出
//这里我们关联了两个库 一个是liblog 和 libz
ldLibs “log”,“z”
// 声明创建指定cpu架构的so库, 不声明的话, 默认(gradle 1.5.0)会生成7中架构,如果你的libcurl没有提供别的平台,那么就会链接失败,
//所以此条配置很重要,这里我们只生成一个平台
abiFilters “armeabi”
}

4 在JNI路径下 添加Application.mk文件
在文件中添加如下代码 表示当前ndk_build 过滤平台结果
APP_ABI = armeabi

5 在login.cpp中
添加
#include “curl/curl.h”
在login的jni接口中
随便调用curl代码
CURL* curl = curl_easy_init();
点击SYnc Now

6 ndk_build.cmd 重新生成so文件 看是否能够编译陈宫

7 部署在app手机上,点击一下登陆按钮。如果app不崩溃 环境通了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值