1. 程式人生 > >第一個Android studio JNI程序

第一個Android studio JNI程序

say debug native mil 教程 lib 國內 generate mea

現在網上有很多實用JNI的教程,本文主要用於記錄自己實現的方法和遇到的坑。

第一步,下載NDK.

NDK可以去谷歌Android developer上下載。國內也有些中國版網站可以下載。

第二步,編寫java類,這個類是java和c/c++交互的中介,定義一些native的方法,具體實現由c/c++完成。

package com.example.jni;

/**
 * Created by alexjie on 2017/5/14.
 */

public class JNIDemo {

    static {
        System.loadLibrary("newclient");
    }

    
public static native String sayHello(); }

上部代碼分兩塊,靜態代碼塊用於加載我們後續要生成的c/c++實現的.so庫,第二部分為定義的一個native的本地方法,此方法將由C++實現。

第三步,生成.h頭文件

使用Android Studio的終端Terminal。

技術分享

進入到main目錄下 F:\Andriod\workspaceAS\Demo\newclient\src\main> ,使用命令生成.h頭文件 javah -d jni -classpath ./java com.example.jni.JNIDemo

-d jni 頭文件生成到jni文件夾(當前在<Project>\app\src\main目錄下,所以.h所在的目錄為<Project>\app\src\main\jni )
-classpath ./java 指定去當前路徑下java下尋找包名指定的類

然後就會在main文件夾下生成jni文件夾和com_example_jni_JNIDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_JNIDemo */

#ifndef _Included_com_example_jni_JNIDemo
#define _Included_com_example_jni_JNIDemo
#ifdef __cplusplus
extern 
"C" { #endif /* * Class: com_example_jni_JNIDemo * Method: sayHello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif

第四步,實現main.cpp

.h頭文件生成了,現在要實現C++的具體實現,新建一個C++文件:

技術分享

然後會生成一個main.cpp文件,將.h文件的內容拷入到main.cpp文件,並做具體實現:
//
// Created by alexjie on 2017/5/14.
//
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_JNIDemo */

#ifndef _Included_com_example_jni_JNIDemo
#define _Included_com_example_jni_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jni_JNIDemo
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello(JNIEnv *env, jobject jobj){
      //返回一句話
      return env->NewStringUTF((char *)"JNI hahahahahahahaha");
  };

#ifdef __cplusplus
}
#endif
#endif


第五步,配置NDK
打開Project的local.properties文件添加NDK路徑

技術分享

打開app Module的build.gradle文件,在defaultConfig節點裏添加以下代碼
註意這裏的moduleName,是我們在之前自己編寫的類裏面加載的so庫名
ndk {
            moduleName "newclient"
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }

技術分享

在gradle.properties裏面加上這麽一句話:

android.useDeprecatedNdk=true

技術分享

第六步,生成.so庫

rebuilt項目,在如下目錄會生成.so庫:app\build\intermediates\ndk\debug\lib

在main文件夾下,新建一個jnilib文件夾,將.so庫考到其中。

技術分享

現在在程序中就可以調用JNIDemo.sayHello()方法了。

問題:

1.build apk時,報錯:installation failed with message failed to establish session

解決:關閉MIUI開發者選項中的MIUI優化並重啟!

第一個Android studio JNI程序