zoukankan      html  css  js  c++  java
  • 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:shijueJniHelloappsrcmain>javah -d jni -classpath I:AndriodAndroidSDKplatformsandroid-15android.jar;
    E:shijueJniHelloappuildintermediatesclassesdebug 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
  • 相关阅读:
    养花
    【bzoj1419】Red is good
    C++模板
    逆元求组合数
    【IOI2000】【洛谷1435】回文字串
    Centos 下启动mysql 报错: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)解决方法
    linux系统下进行安装phpMyAdmin(基于Centos)
    达梦数据的安装(Windows10 、linux环境下、麒麟系统下)
    2020-3-3 链表刷题(203. 移除链表元素)
    2020-02-03 刷题
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5535289.html
Copyright © 2011-2022 走看看