介绍apk中Java调用native代码的简单例子。
- Java部分
- 生成jni头文件
- native部分
- 编译
java部分
首先使用Android studio新建一个project。
在你的class(我这里是在com.example.jayawei.testjniapp.MainActivity中)中添加使用的library以及native方法声明:
package com.example.jayawei.testjniapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
final String TAG = "TestJniApp";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView)findViewById(R.id.text);
textView.setText(getStr());
}
static {
System.loadLibrary("testjni");
}
public static native String getStr();
}
然后Build->Build Module ‘app’
生成jni头文件
New->Folder->JNI Folder添加一个jni文件夹
使用javah命令生成头文件
E:\AndroidProject\TestJniApp\app\src\main\java>javah -d ../jni com.example.jayawei.testjniapp.MainActivity
这样jni文件夹中就会多出一个头文件com_example_jayawei_testjniapp_MainActivity.h,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jayawei_testjniapp_MainActivity */
#ifndef _Included_com_example_jayawei_testjniapp_MainActivity
#define _Included_com_example_jayawei_testjniapp_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jayawei_testjniapp_MainActivity
* Method: getStr
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jayawei_testjniapp_MainActivity_getStr
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
头文件中声明了getStr对应的native方法。
native部分
//
// Created by Administrator on 2016/3/19.
//
#include "com_example_jayawei_testjniapp_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_jayawei_testjniapp_MainActivity_getStr
(JNIEnv * env, jclass c){
return (*env)->NewStringUTF(env,"Native String!!!");
}
编译
- 在build.gradle(Module: app)的defaultConfig配置中添加native库名:
defaultConfig {
applicationId "com.example.jayawei.testjniapp"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "testjni" //设置.so库的名称,和System.loadLibrary()中的名称一样
}
}
- make project
这个时候make project会报错
Error:(13, 0) Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
<a href="openFile:E:\AndroidProject\TestJniApp\app\build.gradle">Open File</a>
根据提示,在gradle.properties中添加android.useDeprecatedNdk=true,再make Project就不会报错。
- run apk
这时候跑apk,界面上会出现 “Native String!!!”,成功调用到了native方法!!!