第一个Android studio JNI程序

现在网上有很多实用JNI的教程,本文主要用于记录自己实现的方法和遇到的坑。

第一步,下载NDK.

NDK可以去谷歌Android developer上下载。国内也有些中国版网站可以下载。

第二步,编写java类,这个类是java和c/c++交互的中介,定义一些native的方法,具体实现由c/c++完成。

package com.example.jni;

/**
 * Created by alexjie on 2017/5/14.
 */

public class JNIDemo {

    static {
        System.loadLibrary("newclient");
    }

    public static native String sayHello();
}

上部代码分两块,静态代码块用于加载我们后续要生成的c/c++实现的.so库,第二部分为定义的一个native的本地方法,此方法将由C++实现。

第三步,生成.h头文件

使用Android Studio的终端Terminal。

进入到main目录下 F:\Andriod\workspaceAS\Demo\newclient\src\main>  ,使用命令生成.h头文件 javah -d jni -classpath ./java com.example.jni.JNIDemo

-d jni 头文件生成到jni文件夹(当前在<Project>\app\src\main目录下,所以.h所在的目录为<Project>\app\src\main\jni )
-classpath ./java 指定去当前路径下java下寻找包名指定的类

然后就会在main文件夹下生成jni文件夹和com_example_jni_JNIDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_JNIDemo */

#ifndef _Included_com_example_jni_JNIDemo
#define _Included_com_example_jni_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jni_JNIDemo
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

第四步,实现main.cpp

.h头文件生成了,现在要实现C++的具体实现,新建一个C++文件:

然后会生成一个main.cpp文件,将.h文件的内容拷入到main.cpp文件,并做具体实现:
//
// Created by alexjie on 2017/5/14.
//
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_JNIDemo */

#ifndef _Included_com_example_jni_JNIDemo
#define _Included_com_example_jni_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jni_JNIDemo
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello(JNIEnv *env, jobject jobj){
      //返回一句话
      return env->NewStringUTF((char *)"JNI hahahahahahahaha");
  };

#ifdef __cplusplus
}
#endif
#endif

第五步,配置NDK
打开Project的local.properties文件添加NDK路径

打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk {
            moduleName "newclient"
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }

在gradle.properties里面加上这么一句话:

android.useDeprecatedNdk=true

第六步,生成.so库

rebuilt项目,在如下目录会生成.so库:app\build\intermediates\ndk\debug\lib

在main文件夹下,新建一个jnilib文件夹,将.so库考到其中。

现在在程序中就可以调用JNIDemo.sayHello()方法了。

问题:

1.build apk时,报错:installation failed with message failed to establish session

解决:关闭MIUI开发者选项中的MIUI优化并重启!

时间: 2024-12-09 07:47:24

第一个Android studio JNI程序的相关文章

Android Studio JNI体验

最近项目中需要调用c/c++的实现,Android是支持JNI的,所以体验了一下JNI的全过程 1. 前期环境准备 (1) 下载NDK,网址是https://developer.android.com/ndk/downloads/index.html, 国内用户需要翻墙. 目前官网上mac版最新的是android-ndk-r10e-darwin-x86_64.bin, 文件比较大,300多M. 下载下来后,解压到相应目录,备用.解压命令如下: ndk$ chmod a+x android-ndk

Android Studio JNI编程

操作步骤: 配置好NDK开发环境 指明ndk路径 可以在local.properties中手动输入ndk路径,或者用Studio菜单栏File--Project Structure--Android NDK Location中点击选中ndk路径. 修改build.gradle配置 工程中共有两个build.gradle配置文件,我们要修改的是在<Project>\app\build.gradle这个文件(就是Module:app).为其在defaultConfig分支中增加上 ndk { mo

实现Android Studio JNI开发C/C++使用__android_log_print输出Log

相信很多人在刚开始学习Android JNI编程的时候,需要输出Log,在百度Google搜索的时候都是说需要在Android.mk中加入LOCAL_LDLIBS+= -L$(SYSROOT)/usr/lib -llog ,其实这是在eclipse开发上的方式,Android Studio并不是这么使用. Android Studio的Android.mk是自动生成的,就算修改也是没用了,实际Android Studio的Android.mk是根据gradle文件生成的,那么就需要修改gradl

自己动手实现一个Android Studio插件

在使用Android Studio开发的时候,大部分人都会使用一些插件来提高开发效率,例如我们所熟知的butternife,selector,,GsonFormat等,这些分别从不同的原理来帮助我们提高开发效率,也美化了我们的代码结构. 既然插件有这么多好处,我们就来自己实现一个简单的吧,这里为了方便讲解我们,我们就以Android tintBar作为例子来讲解.Android Studio是基于Intellij IDEA,网上查找后发现好像可以在Intellij IDEA中进行插件开发,And

Android Studio 学习 - 程序安装

痛定思痛,从今天开始专心学习AndriodStudio.希望以此为契机,把Java学扎实.更希望自己能坚持下去,不要半途而废. 记录一些日常的工作以及碰到的问题,权当勉励自己.荀子曰:吾尝终日而思矣,不知须臾之所学也:吾尝跂而望矣,不如登高之博见也.锲而舍之,朽木不折:锲而不舍,金石可镂. 一.软件安装 一波三折的终于搞定了Android Studio的安装,SDK的下载. 过程中借鉴了网上很多前辈们的经验,记录一些个人感觉很有价值的链接: 1. http://www.androiddevtoo

Android Studio运行程序时找不到安卓模拟器

在android studio写完代码要运行看看效果时会发现当打开模拟器选择窗口是完全找不到已经存在的模拟器选项,但是这个时候模拟器明明是已经打开的的状态,就算重启模拟器也没用.而且这种情况是偶尔发生的,也就是说大多数情况都是可以找到模拟器的.如下图: 其实这种情况有两种解决办法,第一种是重启你的编译器,没错,因为进程被占用了所以你找不到你已经打开的模拟器,但是你又没有被的解决办法的话只要重启android studio就行了,重启模拟器是没有用的,所以必须是重启编译器.这种方法有效但是有点复杂

Android Studio JNI编程以及NDK环境配置

1. 新建一个工程,并添加JNI文件夹. 2. 在生成的jni文件夹中添加cpp文件. 3. 在添加的cpp文件添加代码.这里我们采用动态注册的方式来添加jni函数,比较方便,不需要用javah生成.h文件 #include <jni.h> #include <android/log.h> #include <assert.h> #include <stdio.h> /* 输出Log的宏 */ #ifndef LOG #define LOG_TAG &quo

给予Socket一个android日志收集程序附客户端调用DEMO

来源:解决手机客户端实时跟踪调试问题. 主要说明:主要用于调试收集多终端相关日志信息作用. 现在仅限局域网.使用外网青保证映射正确.如.一个APP多个终端同时使用.测试问题的体现可以使用此软件进行定位处理.软件服务端使用线程池可保证大数据量下的稳定性.理论上可接受任何给予socket的信息交互程序.下面有已经被使用的JAVA客户端代码供大家参考. JAVA客户端DEMO代码: new SendPcLog(log).start(); package cn.sj.soft; import java.

Android Studio JNI 环境搭建

需要单独下载 NDK 环境变量配置,?~/.bash_profile(如果没有则自动创建)输入以上代码进行配置,退出后执行source命令生效 export PATH=$PATH:/Users/confiwang/Applications/android-ndk-r11c/ ANDROID_NDK_ROOT=/Users/confiwang/Applications/android-ndk-r11c/ export ANDROID_NDK_ROOT 新建一个工程使用空白的activity 修改l