如何用android studio搭建JNI(调用C/C++代码)
2017-03-08 13:36
337 查看
如何用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
相关文章推荐
- c++代码通过JNI调用Java代码时用到的签名信息如何获取
- Android Studio中通过jni实现对C/C++代码的调用,HelloJni,Ubuntu
- android中如何通过jni调用c,c++代码
- android studio中使用ndk编译.so文件,调用C/C++代码(jni编程)
- 使用JNI进行混合编程:在C/C++中调用Java代码
- 如何在C++中调用C的代码
- 如何在C++中调用C的代码
- linux的ubuntu上如何编译C和C++代码写的动态库,以及调用执行
- java使用JNI调用C++代码(vs2010生成dll文件)
- 如何在C++代码中调用python代码(MinGW+Boost.Python)
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android JNI简单实例(android 调用C/C++代码)
- JNI技术实践(1) Java调用C/C++代码
- 如何在C++代码中调用python代码(MinGW+Boost.Python)
- Jni 参数传递与操作——(C/C++ 代码与 java 代码的互相调用)
- C++调用Lua编程环境搭建及测试代码示例
- linux 下python 调用C++ .so如何debug c++代码
- 如何让python调用C和C++代码
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C++代码