博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Studio 下使用JNI运行hello word程序
阅读量:6257 次
发布时间:2019-06-22

本文共 2268 字,大约阅读时间需要 7 分钟。

  hot3.png

1. 安装和配置NDK

  • 下载NDK,并解压NDK的zip包到非中文目录

  • 配置path : 解压后NDK的根目录

eg:   D:\software_download\android-ndk-r10;

2. 在AS中配置关联NDK

  • local.properties中添加配置
ndk.dir=D\:\\software_download\\android-ndk-r10
  • Project工程目录下gradle.properties文件中添加配置
android.useDeprecatedNdk=true

3. 编写native方法

在AS中新建一个Project,然后再新建一个class为JNIS,在内部声明native方法

public class JNIS {    	public native String helloJNI();    }

4. 定义对应的JNI

  • 在main下创建jni文件夹

  • 生成native方法对应的JNI函数声明头文件

在cmd命令窗口中,切换目录到java目录下(D:\as_workspace\Project\testjni\src\main\java),运行命令 :

javah com.hx.testjni.JNIS

会生成com_hx_testjni_JNIS.h的头文件,内容为

#include 
/* Header for class com_hx_testjni_JNIS */#ifndef _Included_com_hx_testjni_JNIS#define _Included_com_hx_testjni_JNIS#ifdef __cplusplusextern "C" {#endif/* * Class: com_hx_testjni_JNIS * Method: helloJNI * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_hx_testjni_JNIS_helloJNI (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
  • 将生成的头文件转移到jni文件夹下

  • 在jni下定义对应的函数文件: test.c 内容如下:

#include "com_hx_testjni_JNIS.h"  //引用生成头文件JNIEXPORT jstring JNICALL  Java_com_hx_testjni_JNIS_helloJNI          (JNIEnv * env, jobject jobj) {        return (*env)->NewStringUTF(env, "Hello from C");    }
  • 在jni文件夹下创建一个空的C文件: empty.c

说明: 这是AS的bug, 必须至少2个C文件才能通过编译

5. 指定编译的不同CPU

在testjni Module目录下build.gradle文件中配置

android {       ...    defaultConfig {        ...        ndk{            moduleName "HelloJni" //so文件: lib+moduleName+.so            abiFilters "armeabi", "armeabi-v7a", "x86" //cpu的类型        }    }}

6. 编译生成不同平台下的动态链接文件

点击AS工具栏中的Build-->Rebuild Project,生成 .so文件 (so文件目录: build\intermediates\ndk\debug\lib\ndk\debug\lib...)

7. 调用native方法

  • 在native方法所在的类(JNIS类中)中加载so文件
public class JNIS {        static {        	System.loadLibrary("HelloJni");  //加载.so文件            	      }    	public native String helloJNI();    }
  • 在Activity中调用native方法:
public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        String result = new JNIS().helloJNI();        Log.e("TAG", "result=" + result);        Toast.makeText(this, result, Toast.LENGTH_SHORT).show();    }}

下面为项目的目录结构图:

输入图片说明

转载于:https://my.oschina.net/fltsp/blog/719111

你可能感兴趣的文章
IPv6太落后了:中国加速服务器援建
查看>>
物理引擎中velocity的单位是个什么鬼?
查看>>
oracle的drop命令
查看>>
设计与梳理企业二级流程的路线方法
查看>>
垃圾回收概念与算法
查看>>
TFS实现需求工作项自动级联保存
查看>>
springmvc 4.x 处理json 数据时中文乱码
查看>>
Python练习(day7)
查看>>
网络工程师笔试题总结
查看>>
飞舞的蝴蝶
查看>>
对Map按key和value分别排序
查看>>
Async Performance: Understanding the Costs of Async and Await
查看>>
POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)
查看>>
Linux中select poll和epoll的区别
查看>>
Cocos2d-x之MenuItem
查看>>
远程共享文件夹
查看>>
[转] C/C++中printf和C++中cout的输出格式
查看>>
swift 如何实现点击view后显示灰色背景
查看>>
【Android】3.9 覆盖物功能
查看>>
MySQL也有潜规则 – Select 语句不加 Order By 如何排序?
查看>>