Android Studio 用 JNI 实现与原生代码通信
博客专区 > vwarship 的博客 > 博客详情
Android Studio 用 JNI 实现与原生代码通信
vwarship 发表于3年前
Android Studio 用 JNI 实现与原生代码通信
  • 发表于 3年前
  • 阅读 138
  • 收藏 4
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 代码:https://github.com/vwarship/Samples/tree/master/Android/NDK/HelloJNI

开发步骤

1.创建 HelloJNI 类

package com.zaoqibu.hellojni;public class HelloJNI {
    public native String  stringFromJNI();
    static {
        System.loadLibrary("hello-jni");
    }
}
  • 原生方法的声明 public native String stringFromJNI();

  • 静态加载共享库,System.loadLibrary("hello-jni");。库的名字在 jni/Android.mk 文件中定义的 LOCAL_MODULE 变量。

2.使用 javah 生成 JNI 头文件

通过 Java 类生成头文件。

D:\Samples\Android\NDK\HelloJNI\app\src\main\java>javah com.zaoqibu.hellojni.HelloJNI

通过 class 生成头文件。(使用前得编译出 class 才能用)

D:\Samples\Android\NDK\HelloJNI\app>javah -classpath build/intermediates/classes/debug com.zaoqibu.hellojni.HelloJNI

3.增加 jni 目录及文件

src
jni\
    Android.mk
    Application.mk
    com_zaoqibu_hellojni_HelloJNI.h
    com_zaoqibu_hellojni_HelloJNI.c

4.原生方法的实现 com_zaoqibu_hellojni_HelloJNI.c

#include <com_zaoqibu_hellojni_HelloJNI.h>
#include <string.h>
JNIEXPORT jstring JNICALL Java_com_zaoqibu_hellojni_HelloJNI_stringFromJNI(
JNIEnv *env, jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello from JNI!");
}

5.构建共享库的描述 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := com_zaoqibu_hellojni_HelloJNI.c

include $(BUILD_SHARED_LIBRARY)

6.生成所有支持的CPU体系结构的共享库 Application.mk

APP_ABI := all

7.编译共享库 ndk_build

D:\Samples\Android\NDK\HelloJNI\app\jni>ndk_build
  • 生成共享库到 libs 目录。

8.修改 app 构建文件 build.gradle,打包 APK 时,增加共享库。 在 android 中增加

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

修改后

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.zaoqibu.hellojni"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

9.调用原生方法。HelloJNIActivity.java

public class HelloJNIActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hellojni);        
        HelloJNI helloJNI = new HelloJNI();        
        String hello = helloJNI.stringFromJNI();        
        TextView textView = (TextView)findViewById(R.id.textView);
        textView.setText(hello);
    }

}

10.运行

参考

JNI Tips

Android Studio: Android Manifest doesn't exists or has incorrect root tag


标签: Android Studio JNI NDK
共有 人打赏支持
vwarship
粉丝 7
博文 2
码字总数 810
作品 8
×
vwarship
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: