第一個Android studio JNI程序
阿新 • • 發佈:2017-05-15
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程序