Android(安卓)Studio 用 JNI 实现与原生代码通信
16lz
2021-01-24
开发步骤
1.创建 HelloJNI 类
packagecom.zaoqibu.hellojni;publicclassHelloJNI{publicnativeStringstringFromJNI();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>javahcom.zaoqibu.hellojni.HelloJNI
通过 class 生成头文件。(使用前得编译出 class 才能用)
D:\Samples\Android\NDK\HelloJNI\app>javah-classpathbuild/intermediates/classes/debugcom.zaoqibu.hellojni.HelloJNI
3.增加 jni 目录及文件
srcjni\Android.mkApplication.mkcom_zaoqibu_hellojni_HelloJNI.hcom_zaoqibu_hellojni_HelloJNI.c
4.原生方法的实现 com_zaoqibu_hellojni_HelloJNI.c
#include<com_zaoqibu_hellojni_HelloJNI.h>#include<string.h>JNIEXPORTjstringJNICALLJava_com_zaoqibu_hellojni_HelloJNI_stringFromJNI(JNIEnv*env,jobjectthiz){return(*env)->NewStringUTF(env,"HellofromJNI!");}
5.构建共享库的描述 Android.mk
LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=hello-jniLOCAL_SRC_FILES:=com_zaoqibu_hellojni_HelloJNI.cinclude$(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']}}
修改后
applyplugin:'com.android.application'android{compileSdkVersion21buildToolsVersion"21.1.1"defaultConfig{applicationId"com.zaoqibu.hellojni"minSdkVersion14targetSdkVersion21versionCode1versionName"1.0"}buildTypes{release{minifyEnabledfalseproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}sourceSets{main{jniLibs.srcDirs=['libs']}}}dependencies{compilefileTree(dir:'libs',include:['*.jar'])compile'com.android.support:appcompat-v7:21.0.3'}
9.调用原生方法。HelloJNIActivity.java
publicclassHelloJNIActivityextendsActionBarActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_hellojni);HelloJNIhelloJNI=newHelloJNI();Stringhello=helloJNI.stringFromJNI();TextViewtextView=(TextView)findViewById(R.id.textView);textView.setText(hello);}}
10.运行
参考
JNI Tips
Android Studio: Android Manifest doesn't exists or has incorrect root tag
更多相关文章
- android asset中 zip包解压sdcard
- android中webviewjs与java的相互调用
- Android隐藏标题栏的四种方法
- Android(安卓)menu使用
- Android(安卓)强制设置横屏或竖屏 设置全屏
- MTK android 常用修改点
- Android分享笔记(5) Android(安卓)与 JS 交互
- 新浪微博Oauth2.0授权认证及SDK、API的使用(Android)
- android多语言切换失效