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

posted on 2016-05-27 16:59  Sun‘刺眼的博客  阅读(365)  评论(0编辑  收藏  举报

导航