您的位置:首页 > 移动开发 > Android开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: