您的位置:首页 > 移动开发 > Android开发

Android Studio JNI 开发简单案例

2016-12-12 14:48 274 查看
转载:http://www.androidchina.net/5744.html

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

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

配置环境

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



项目关联NDK ,具体操作如图:

右键你的工程项目,选择 【Open Module Settings】



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



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

android.useDeprecatedNdk=true

如图:



JNI实现

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


生成 .h 文件

新建
TestJNI


public class TestJNI {

public native String HelloWord(String str);

}




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
文件:

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

#ifndef _Included_com_github_jni_demo_TestJNI
#define _Included_com_github_jni_demo_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_github_jni_demo_TestJNI
* Method:    HelloWord
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

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



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



生成 .C 文件

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



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

#include <stdio.h>
#include <stdlib.h>
#include "com_github_jni_demo_TestJNI.h"
JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord
(JNIEnv *env, jobject, jstring str) {
return str;
}

build.gradle 配置 ndk

defaultConfig
节点下加入如下代码:

ndk {
moduleName "TestJNI"
abiFilters "armeabi", "armeabi-v7a", "x86"
}

点击
Build
>
Make Project
如图:



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



Java中调用JNI

记得把生成的
.so
文件拷贝到项目的
libs
目录下:



接着在
Java
中调用
JNI


package com.github.jni_demo;

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

public class MainActivity extends AppCompatActivity {
static {        // 加载动态库
System.loadLibrary("TestJNI");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TestJNI  testJNI=new TestJNI();
Log.e("---------------","************"+testJNI.HelloWord("恭喜你,调用成功!"));
}
}




这样你就生成了一个属于自己的
.so
文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: