因为公司需要为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

完成!

因为其他人写过一些类似的博客,所以我这边有些地方写的不是很详细,但是如果按照我说明的来做,应该不会有问题的,而且每一步都不要缺少,有些具体的文件的代码的含义大家可以在网上查一下,有很多详细的说明。

分类: Java
标签: javaAndroidJNI

Android studio 下JNI编程实例并生成so库的更多相关文章

  1. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...

  2. Android Studio下jni应用

    最近在将一个小应用从eclipse开发迁移到android studio,程序中有native代码实现,在eclipse是靠Android.mk这么个mk文件来组织编译的,但到android stud ...

  3. 《jdk10》删除javah.exe文件,在Android studio编译jni,使用jdk10生成头文件

    今天在用“死丢丢”编译so包的时候,只要一输入"javah -jni..."的命令就会一直提示 'javah'不是内部命令或外部命令,也不是可运行的程序或批处理文件 找了很久才发现 ...

  4. 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子

    Android 开发了一段时间,一方面 ,感觉不留下点什么.有点对不起自己, 另一方面,好记性不如烂笔头,为了往后可以回头来看看,就当做是笔记,便决定开始写博客.废话不多说 ! 今天想搞一搞 ndk ...

  5. Android studio 下 NDK Jni 开发 简单例子

    1. 创建一个新的工程 2. 创建一个新的类 JniText.java  点击Build--Make Project  后     选中工程 点击F4键 sdk location 中 Android ...

  6. Android Studio下使用NDK的流程

    我要重新拿回持之以恒徽章!! 老规矩,先说看能学会什么:ANDROID STUDIO下NDK的使用方法.JNI的基本使用方法,C语言调用JAVA的方法. 首先要下载NDK,如果你没有VPN可以来htt ...

  7. Android Studio下打jar包

    在我们使用Eclipse时,我们常常使用的第三方类库文件大多都是jar包形式,用起来很方便.但是jar包只能打包class文件,对于Android UI类库而言,我们常常需要打包资源文件,对于界面不多 ...

  8. Android Studio下导出jar包和aar包

    Android Studio下导出jar包和aar包 jar包和aar包的区别 步骤 1. 创建Android工程 创建工程比较简单,不错复述 2. 创建一个Library(Module) 创建了一个 ...

  9. Android Studio下多渠道打包

    Android Studio下实现多渠道打包 直接上步骤 步骤 1. 清单文件添加属性(以友盟统计为例) 在application标签下添加meta-data属性 <application -- ...

随机推荐

  1. uva 10887

    是个 hash  用的容器类水过 #include <iostream> #include <cstdio> #include <string> #include ...

  2. Ignore files which are already versioned

    If you accidentally added some files which should have been ignored, how do you get them out of vers ...

  3. django在nginx uwsgi和tornado异步方案在项目中的体验

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rfyiamcool.blog.51cto.com/1030776/1397495 ...

  4. DOM对象和JQuery对象的区别

    DOM对象和JQuery对象的区别 jQuery对象和DOM对象使用说明,需要的朋友可以参考下.1.jQuery对象和DOM对象第一次学习jQuery,经常分辨不清哪些是jQuery对象,哪些是 DO ...

  5. SPOJ LCS2 后缀自动机

    多串的LCS,注意要利用拓扑序更新suf的len. 我用min,max,三目会超时,所以都改成了if,else #pragma warning(disable:4996) #include<cs ...

  6. 01 - 编译链接第一个wxWidgets3.0例子

    1. preprocessor #define __WXMSW__#define WXUSINGDLL 2. vc10中设置Include dir, lib dir, dll path VC++平台编 ...

  7. 深入理解JVM—Java 6 JVM参数配置说明

    原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011119111014657/ 使用说明< xmlnamespace pre ...

  8. spring webservice 开发demo (实现基本的CRUD 数据库采用H2)

    在实现过程中,遇到两个问题: 1: schema 写错: 错误: http://myschool.com/schemas/st 正确: http://myschool.com/st/schemas   ...

  9. 【mongoDB运维篇④】Shard 分片集群

    简述 为何要分片 减少单机请求数,降低单机负载,提高总负载 减少单机的存储空间,提高总存空间. 常见的mongodb sharding 服务器架构 要构建一个 MongoDB Sharding Clu ...

  10. HTML5入门3---视频播放器

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...