阿里云服务器免费领卷啦。

捡代码论坛-最全的游戏源码下载技术网站!

 找回密码
 立 即 注 册

QQ登录

只需一步,快速开始

搜索
关于源码区的附件失效或欺骗帖, 处理办法
查看: 2217|回复: 0

Android Studio JNI 开发简单案例

[复制链接]

4208

主题

210

回帖

12万

积分

管理员

管理员

Rank: 9Rank: 9Rank: 9

积分
126198
QQ
发表于 2016-11-25 09:18:03 | 显示全部楼层 |阅读模式

进程保活,热修复,硬件接入等等都需要底层的支持,而底层代码是 C 、C++ 写的,那么在 Android 中怎么调用底层的库呢?这里就需要了解 JNI 技术。

Android Studio 出来两年多了,网上针对 AS 开发 JNI 工程资源比较少,针对于此,我特意写下本篇博客,希望能对大家有所帮助。

配置环境

捡代码论坛(bbs.jiandaima.com)整理提供

下载NDK 请点击这里 ,并进行环境配置,如图:

项目关联NDK ,具体操作如图:
右键你的工程项目,选择 【Open Module Settings】

在 【Android NDK location】配置 NDK 的按着目录:

最后在 项目根目录 【gradle.properties】 下加上:



  1. android.useDeprecatedNdk=true
复制代码

如图:

JNI实现

新建 JNI_DEMO 项目,完成以上的配置工作。我的项目路径为:D:\Android_Study_Demos\JNI_DEMO

生成 .h 文件
新建TestJNI类




  1. public class TestJNI {

  2.    public native String HelloWord(String str);

  3. }
复制代码

在cmd命令下面,cd到java目录,输入javah -jni com.github.jni_demo.TestJNI命令,生成 .h 文件:

注意:com.github.jni_demo.TestJNI 不能 cd com , cd github……否则编译不成功。

你会发现在你的java路劲下生成了com_github_jni_demo_TestJNI.h文件:




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

  4. #ifndef _Included_com_github_jni_demo_TestJNI
  5. #define _Included_com_github_jni_demo_TestJNI
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     com_github_jni_demo_TestJNI
  11. * Method:    HelloWord
  12. * Signature: (Ljava/lang/String;)Ljava/lang/String;
  13. */
  14. JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord
  15.   (JNIEnv *, jobject, jstring);

  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif
复制代码

然后右键 app >New> Folder > JNI Folder 生成jni目录如图:

然后拷贝com_github_jni_demo_TestJNI.h到jni目录下面:

生成 .C 文件
右键jni,生成com_github_jni_demo_TestJNI.cpp文件:

拷贝以下代码到 .cpp 文件中:



  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "com_github_jni_demo_TestJNI.h"
  4. JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord
  5.         (JNIEnv *env, jobject, jstring str) {
  6.     return str;
  7. }
复制代码


build.gradle 配置 ndk

在defaultConfig节点下加入如下代码:




  1. ndk {
  2.       moduleName "TestJNI"
  3.       abiFilters "armeabi", "armeabi-v7a", "x86"
  4.   }
复制代码

点击 Build > Make Project 如图:

编译成功后,打开 build > intermediates > ndk > debug > lib 下查看生成的 .so 文件:

Java中调用JNI
记得把生成的 .so 文件拷贝到项目的 libs 目录下:

接着在Java中调用JNI:



  1. package com.github.jni_demo;

  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.util.Log;

  5. public class MainActivity extends AppCompatActivity {
  6.     static {        // 加载动态库
  7.         System.loadLibrary("TestJNI");
  8.     }
  9.     @Override
  10.     protected void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.activity_main);
  13.         TestJNI  testJNI=new TestJNI();
  14.         Log.e("---------------","************"+testJNI.HelloWord("恭喜你,调用成功!"));
  15.     }
  16. }
复制代码



这样你就生成了一个属于自己的 .so 文件。

捡代码论坛(bbs.jiandaima.com)整理提供

..


捡代码论坛-最全的游戏源码下载技术网站! - 论坛版权郑重声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与捡代码论坛-最全的游戏源码下载技术网站!享有帖子相关版权
3、捡代码论坛版权,详细了解请点击。
4、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
5、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
6、如无法链接失效或侵犯版权,请给我们来信:jiandaima@foxmail.com

回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立 即 注 册

本版积分规则

技术支持
在线咨询
QQ咨询
3351529868

QQ|手机版|小黑屋|捡代码论坛-专业源码分享下载 ( 陕ICP备15015195号-1|网站地图

GMT+8, 2024-5-2 04:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表