Android Studio 用 JNI 实现与原生代码通信
2015-02-27 00:00
573 查看
摘要: 代码:https://github.com/vwarship/Samples/tree/master/Android/NDK/HelloJNI
原生方法的声明 public native String stringFromJNI();
静态加载共享库,System.loadLibrary("hello-jni");。库的名字在 jni/Android.mk 文件中定义的 LOCAL_MODULE 变量。
通过 class 生成头文件。(使用前得编译出 class 才能用)
生成共享库到 libs 目录。
修改后
开发步骤
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 { &n 3ff0 bsp; 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 NDK 使用JNI实现与原生代码通信
- Jni实现与原生代码通信
- jni中java与原生代码通信规则
- Android jni编程浅入深出之-- 与原生代码通信
- Android studio 下JNI编程实例并生成so库的实现代码
- Android Studio中通过jni实现对C/C++代码的调用,HelloJni,Ubuntu
- Android平台下通过JNI快速实现音视频通信
- 原生javascript实现图片轮播效果代码
- android的HAL第一种调用hal方法中的JNI代码的实现:
- WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信
- JAVA用JNI方法调用C代码实现HelloWorld(含windows及ubuntu两种操作系统环境下的操作)
- Android手机客户端通过JSP实现与Tomcat服务器端通信(Msql数据库,Json作为载体)--客户端代码
- Android NDK的C/C++代码中利用JNI回调实现字符编码转换
- Android NDK的C/C++代码中利用JNI回调实现字符编码转换的试验(中文UTF8与GBK)
- 原生js实现半透明遮罩层效果具体代码
- android JNI 实现C代码调用
- Java实现的基于socket通信的实例代码
- javascript与webservice的通信实现代码
- Android NDK的C/C++代码中利用JNI回调实现字符编码转换
- Linux 管道替换标准输入输出 实现2个独立程序代码之间的通信