如何用android studio搭建JNI(调用C/C++代码)

如何用android studio搭建JNI(调用C/C++代码)

刚学习了在android studio中调用C/C++代码,现在做如下笔记

注:
-阅读这篇文章大约需要:10分钟
-这是我第一篇博客,有写的不对的地方欢迎大家留言指正
-本篇文章适于 初学者
-我大部分是跟着http://blog.csdn.net/u013210543/article/details/52103015这篇文章学习的

前言:
为何要调用C/C++代码:

  • 程序执行效率高
    C效率>C++效率>JAVA效率
    C与C++效率差的小些,C与JAVA效率差很多

  • 代码安全性
    Java代码容易被反编译出来

因此在android开发中会经常用到C/C++
在很多企业的图片处理,视频处理这种要求性能的功能中经常会用到(比如照片美颜,语音变声大部分都是用C/C++完成),
或者一些保密性要求较高的例如通信协议,数据加密

看看效果

这里写图片描述


废话少说

一,先新建一个工程
- 这里不细说了,相信各位都能搞定

我这里工程名叫 JniDemo
包名 com.gym.jnidemo
(那个Include C++ Support不知道是什么,反正勾选后 他会在main文件夹下生成一个cpp文件夹 里面给了一个c++的hello world,求大神给讲解一下)

二,配置NDK以及环境变量
(1)studio内配置
这里写图片描述
这里写图片描述

(2)配置环境变量
此电脑,右键,属性 然后看图
这里写图片描述

这里写图片描述
在系统变量(也可以在上面的用户变量)中添加了一个D:\assdk\ndk-build(D:\assdk 这个地方填你刚才studio中所用到的sdk的路径) 保存一下就配置完了

检验变量是否配置成功:
cmd命令中键入nk-build出现如图就成功了
这里写图片描述

三,在项目中调用

(1)加载库,定义函数

public class MainActivity extends AppCompatActivity {


//静态代码块
    static{                 

        //加载C/C++类库 这个hi_jni的名字是我们自己起的
        System.loadLibrary("hi_jni");

    }

   //在这定义一个jni函数接口,跟C的头文件以及C文件有对应关系
    public native String getStringFromC();

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activi
ty_main);

   }

(2)在app的build.gradle中配置ndk

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.gym.jnidemo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //在defaultConfig 中配置ndk信息
        ndk{
            moduleName "hi_jni"
            ldLibs "Log","z","m"
            abiFilters "armeabi","armeabi-v7a","x86"
        }

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    //在android 中配置.so文件存放位置
    sourcesets{
        main{
            jniLibs.dir['lib']
        }
    }

}

(3)生成.h头文件
用命令行(建议用Android studio的Terminal因为它直接指向当前工程目录中)

javah -d jni -classpath 这个地方写sdk的platforms的任意一个版本文件夹的绝对路径;app\src\main\java com.gym.jnidemo.MainActivity
我的效果如下:
这里写图片描述

完成后会在工程目录下生成一个jni文件夹里面带一个头文件
这里写图片描述

(4)写一个.c文件
在jni文件夹中新建一个c文件
内容如下 我起的文件名main_activity.c

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

#ifndef _Included_com_gym_jnidemo_MainActivity
#define _Included_com_gym_jnidemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_gym_jnidemo_MainActivity
 * Method:    getStringFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_gym_jnidemo_MainActivity_getStringFromC
  (JNIEnv * env, jobject jobj){
  return (*env)->NewStringUTF(env,"从C返回的数据")
  }

#ifdef __cplusplus
}
#endif
#endif

在jni文件夹中新建一个文件Application.mk内容如下

APP_CFLAGS += -Wno-error=format-security
APP_ABI := armeabi

在jni文件夹中新建一个文件Android.mk内容如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
#bzlib模块
bzlib_files := \
    main_activity.c

LOCAL_MODULE := libbz
LOCAL_SRC_FILES := $(bzlib_files)
include $(BUILD_STATIC_LIBRARY)

#bspath模块
include $(CLEAR_VARS)
LOCAL_MODULE    := main_activity
LOCAL_SRC_FILES := main_activity.c
LOCAL_STATIC_LIBRARIES := libbz #引入libbz库

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := hi_jni
LOCAL_SRC_FILES := main_activity.c
LOCAL_STATIC_LIBRARIES := main_activity
LOCAL_LDLIBS := -llog#加入log

include $(BUILD_SHARED_LIBRARY)

四,生成so文件
(1)项目目录下用ndk-build
这里写图片描述

(2)再把如图所示的红色文件夹里生成的文件移动到蓝绿色文件夹内就可以了
这里写图片描述

五,调用
在MainActivity中

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //显示
        ((TextView)findViewById(R.id.tv)).setText(getStringFromC());
    }

大功告成!

最后献上代码http://download.csdn.net/detail/g000321/9774292

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio 可以通过 JNI(Java Native Interface)来调用 C/C++ 文件。 具体步骤如下: 1. 在 Android Studio 项目下,创建一个名为 `jni` 的目录。 2. 在 `jni` 目录下,创建一个名为 `native-lib.c` 的 C 文件。 3. 在 `native-lib.c` 文件中实现需要调用的 C/C++ 函数。 4. 在 `jni` 目录下创建一个名为 `Android.mk` 的文件,用于编译 `native-lib.c`。 ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := native-lib LOCAL_SRC_FILES := native-lib.c include $(BUILD_SHARED_LIBRARY) ``` 5. 在 `jni` 目录下创建一个名为 `Application.mk` 的文件,用于指定编译选项。 ``` APP_ABI := all ``` 6. 在 `MainActivity.java` 文件中,声明需要调用的 C/C++ 函数。 ``` public native int add(int a, int b); ``` 7. 在 `MainActivity.java` 文件的 `onCreate` 方法中,加载动态库,并调用 C/C++ 函数。 ``` static { System.loadLibrary("native-lib"); } int result = add(1, 2); ``` 8. 使用 `ndk-build` 命令编译动态库,并将编译生成的 `.so` 文件放置到 `app/src/main/jniLibs` 目录下。 9. 运行 Android 应用程序,即可调用 C/C++ 函数。 注意事项: 1. 需要在 `build.gradle` 文件中添加如下配置: ``` android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'x86' } } sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } } ``` 2. 需要安装 NDK 工具包,并在 `local.properties` 文件中指定 NDK 路径。 ``` ndk.dir=/path/to/ndk ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值