Android studio 下JNI编程实例并生成so库
2016-05-27 16:59
537 查看
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
完成!
因为其他人写过一些类似的博客,所以我这边有些地方写的不是很详细,但是如果按照我说明的来做,应该不会有问题的,而且每一步都不要缺少,有些具体的文件的代码的含义大家可以在网上查一下,有很多详细的说明。
分类: Java
标签: java, Android, JNI
相关文章推荐
- Android上的MVP模式
- Android开发设计模式之——单例模式
- 1、读取Android工程下的配置文件
- Android实现应用下载并自动安装apk包
- Android Studio之常用设置
- Android中如何通过程序打开或关闭GPS
- Android 自定义View属性相关细节
- Android CardView 的使用
- Android Studio 项目导入
- android 基础 加密 简易加密BASE64Decoder
- Android Studio 安装完成,启动时一直download Components解决办法
- 自定义view实现涂鸦(画板)功能
- Android NDK 安装与配置
- Android开发之Broadcast Receiver 详解
- Android下拉刷新上拉加载控件,对所有View通用!
- 自定义ButtonButton
- android studio 开发 cordova plugin(组件)的 helloWorld
- Scroller 学习
- Android签名详解(debug和release)
- Android Studio多渠道快速打包