Android studio 下JNI编程实例并生成so库
因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小demo。这期间有许多坑,网上资料有的用eclipse,有的用Android studio,后者资料少一些,在做的过程中出现了许多问题,还好最后都一个一个解决了,以下是总结,希望后来者少走弯路,写的略微简略,但是比较全面完整。
1,建立一个新工程,只有一个MainActivity,里面加载库文件并且调用若干本地方法,然后build-makeproject生成class文件;
package com.example.machnike_pc.jnitest2; import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String s=returnString();
System.out.println(s);
int a=1000;
System.out.println(sayhello(a)); }
static {
System.loadLibrary("nativeTest");
}
private native int sayhello(int t);
private native String returnString(); }
2,在控制台或者Android studio自带的控制台使用javah -jni的命令,利用class文件生成.h头文件,里面有Android工程里本地方法的声明。
这里要注意 javah -jni 在使用时有可能会出问题,比如找不到app.activity 找不到类文件,我最后总结出来的就是严格按照以下来写:
E:\shijue\JniHello\app\src\main>javah -d jni -classpath I:\Andriod\AndroidSDK\platforms\android-15\android.jar;
E:\shijue\JniHello\app\build\intermediates\classes\debug com.example.machenike_pc.jnihello.JniTest
说明:红色为命令路径,需要cd到这个文件夹下面来(eclipse里好像直接到src下就行),javah是命令名字,深绿色为生成文件夹jni,紫色为android.jar所在的位置(防止找不到app.activity),浅绿色为class文件的路径+类全名(路径最后一个文件夹是debug之后空格+类全名)
3,在生成的jni目录下写一个c或者c++文件,文件名随意,实现本地方法 ,之后需要在该路径下再加一个空的cpp或c文件(估计是软件的bug,不加的话很可能出ndk错误),比如我加了个util.cpp的文件,里面什么都不写。
下面是我的c++代码
#include<jni.h>
#include<stdio.h>
#include<com_example_machenike_pc_jnitest2_MainActivity.h> #ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_com_example_machenike_1pc_jnitest2_MainActivity_sayhello
(JNIEnv *, jobject, jint); JNIEXPORT jstring JNICALL Java_com_example_machenike_1pc_jnitest2_MainActivity_returnString
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif JNIEXPORT jint JNICALL Java_com_example_machenike_1pc_jnitest2_MainActivity_sayhello
(JNIEnv * env, jobject jobj, jint jnumber)
{
int modify=jnumber+1;
return modify; }
JNIEXPORT jstring JNICALL Java_com_example_machenike_1pc_jnitest2_MainActivity_returnString
(JNIEnv *env, jobject jobj)
{
return env->NewStringUTF("I'm comes from to Native Function!");
4,gradle.properties文件下加入:
android.useDeprecatedNdk=true
5,local.properties文件下加入:(配置ndk路径)
ndk.dir=I\:\\Andriod\\NDK\\android-ndk-r10b
6,build.gradle(app下):文件下加入:(defaultconfig里面)
ndk{
moduleName "nativeTest"
}
此时运行程序已经可以实现本地方法了,之后可以再生成so库文件,方便别人使用,步骤如下:
1,在jni文件夹下写一个Android.make文件写入一下内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := nativeTest LOCAL_SRC_FILES := nativeTest.cpp
LOCAL_SRC_FILES += util.cpp include $(BUILD_SHARED_LIBRARY)
2,在工程根目录下写一个application.make写入以下内容:
APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := nativeTest
3,打开cmd,cd到jni目录(就是之前javah -d jni生成的那个文件夹)下,输入指令: ndk-build
完成!
因为其他人写过一些类似的博客,所以我这边有些地方写的不是很详细,但是如果按照我说明的来做,应该不会有问题的,而且每一步都不要缺少,有些具体的文件的代码的含义大家可以在网上查一下,有很多详细的说明。
Android studio 下JNI编程实例并生成so库的更多相关文章
- Android studio 下 JNI 开发实例
在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...
- Android Studio下jni应用
最近在将一个小应用从eclipse开发迁移到android studio,程序中有native代码实现,在eclipse是靠Android.mk这么个mk文件来组织编译的,但到android stud ...
- 《jdk10》删除javah.exe文件,在Android studio编译jni,使用jdk10生成头文件
今天在用“死丢丢”编译so包的时候,只要一输入"javah -jni..."的命令就会一直提示 'javah'不是内部命令或外部命令,也不是可运行的程序或批处理文件 找了很久才发现 ...
- 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子
Android 开发了一段时间,一方面 ,感觉不留下点什么.有点对不起自己, 另一方面,好记性不如烂笔头,为了往后可以回头来看看,就当做是笔记,便决定开始写博客.废话不多说 ! 今天想搞一搞 ndk ...
- Android studio 下 NDK Jni 开发 简单例子
1. 创建一个新的工程 2. 创建一个新的类 JniText.java 点击Build--Make Project 后 选中工程 点击F4键 sdk location 中 Android ...
- Android Studio下使用NDK的流程
我要重新拿回持之以恒徽章!! 老规矩,先说看能学会什么:ANDROID STUDIO下NDK的使用方法.JNI的基本使用方法,C语言调用JAVA的方法. 首先要下载NDK,如果你没有VPN可以来htt ...
- Android Studio下打jar包
在我们使用Eclipse时,我们常常使用的第三方类库文件大多都是jar包形式,用起来很方便.但是jar包只能打包class文件,对于Android UI类库而言,我们常常需要打包资源文件,对于界面不多 ...
- Android Studio下导出jar包和aar包
Android Studio下导出jar包和aar包 jar包和aar包的区别 步骤 1. 创建Android工程 创建工程比较简单,不错复述 2. 创建一个Library(Module) 创建了一个 ...
- Android Studio下多渠道打包
Android Studio下实现多渠道打包 直接上步骤 步骤 1. 清单文件添加属性(以友盟统计为例) 在application标签下添加meta-data属性 <application -- ...
随机推荐
- recursion lead to out of memory
There are two storage areas involved: the stack and the heap. The stack is where the current state o ...
- 如何配置JAVA的环境变量、Tomcat环境变量
配置JAVA环境变量 1.右击[我的电脑]---[属性]-----[高级]---[环境变量],如图: 2.选择[新建系统变量]--弹出“新建系统变量”对话框,在“变量名”文本框输入“JAVA_HOME ...
- Hibernate逍遥游记-第15章处理并发问题-003乐观锁
1. 2. drop database if exists SAMPLEDB; create database SAMPLEDB; use SAMPLEDB; drop table if exists ...
- Python第一天——初识Python
python是由荷兰人Guido van Rossum 于1989年发明的一种面向对象的的解释型计算机程序设语言,也可以称之为编程语言.例如java.php.c语言等都是编程语言. 那么为什么会有编程 ...
- Java API —— List接口&ListIterator接口
1.List接口概述 有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索 ...
- Maven基本操作命令
1.mvn package 此命令包含一系列过程:validate-->compile-->test-->package Maven根据pom文件里packaging的配置,决定是生 ...
- win7进入不了系统故障修复
问题: 由于电脑关机比较慢,等得不耐烦了,就强制关机了,以前都没事,直到昨晚打开电脑,提示windows错误恢复,试了好久,提示windows无法修复此计算机,看来是没办法了.后来进入系统还原后,总算 ...
- html 表单笔记
表单 表单中主要包括下列元素: button——普通按钮radio ——单选按钮checkbox——复选框select ——下拉式菜单text ——单行文本框textarea——多行文本框s ...
- Lotus Notes中编程发送邮件(二)
在编程发送各种类似通知的邮件时,时常会需要发件人显示为某个特定的帐户,比如某个部门的名称或者管理员的名字.另一种需求是,用户收到某封邮件后,回复邮件的地址不同于发件人栏显示的地址.而正常情况下,发送邮 ...
- Ibatis,Spring整合(注解方式注入)
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...