您好,登錄后才能下訂單哦!
之前寫了一篇JNI的使用,這里其實也是JNI的使用,只不過現在的使用更加方便,不需要什么cygwin或者gnu去創建那邊麻煩,直接eclipse完成所有操作。
先前的一篇:http://xuzhiwei.blog.51cto.com/978424/976839
1、首先現在Android的SDK和NDK
2、sdk中以及集成了eclipse,打開eclipse并下載CDT插件支持,一會兒寫c++使用。
CDT下載地址:http://www.eclipse.org/cdt/
3、配置NDK環境,windows->preferences->Android->NDK進行配置。
4、創建項目
5、創建完成后,右擊項目Android Tools->Add Native Support就可以了。
自動為我們生成了JNI的目錄,以及編譯的Android.mk等文件。
6、好了,開始寫代碼。
創建NativeUtils.java
package com.xzw.firstndk; /** * 與c++的接口類,用來生成.h頭文件 * @author xzw * */ public class NativeUtils { public static native String getWords(); }
現在要生成.h的頭文件,之前是在cmd里面通過javah命令來生成的,這里我們使用ant來自動為我們生成頭文件。
創建build_headers.xml然后以ant editor的方式打開,使用快捷鍵ALT+/生成模板。
<?xml version="1.0" encoding="UTF-8"?> <!-- ====================================================================== 2014-6-19 下午2:07:38 FirstNDK description XMYJ ====================================================================== --> <project name="FirstNDK" default="BuilderHeaders"> <description> description </description> <!-- ================================= target: BuilderHeaders ================================= --> <target name="BuilderHeaders" depends="BuildNativeHeader"/> <!-- - - - - - - - - - - - - - - - - - target: BuildNativeHeader - - - - - - - - - - - - - - - - - --> <target name="BuildNativeHeader"> <!-- destdir:輸出目標目錄 classpath:類路徑 class:要生成的類 --> <javah destdir="./jni" classpath="bin/classes" class="com.xzw.firstndk.NativeUtils"></javah> </target> </project>
右擊運行ant,然后刷新jni目錄就可以看到.h文件了,也把一些依賴庫給我們創建好了,方便很多。
如圖
打開com_xzw_firstndk_NativeUtils.h可以看到:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_xzw_firstndk_NativeUtils */ #ifndef _Included_com_xzw_firstndk_NativeUtils #define _Included_com_xzw_firstndk_NativeUtils #ifdef __cplusplus extern "C" { #endif /* * Class: com_xzw_firstndk_NativeUtils * Method: getWords * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_xzw_firstndk_NativeUtils_getWords (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
現在開始實現,打開FirstNDK.cpp,引入.h頭文件
eclipse提示功能也是很不錯的,alt+/快捷快速提示,
#include <jni.h> #include "com_xzw_firstndk_NativeUtils.h" /* * Class: com_xzw_firstndk_NativeUtils * Method: getWords * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_xzw_firstndk_NativeUtils_getWords (JNIEnv *env, jclass clazz){ return env->NewStringUTF("hello firt ndk"); }
好了,c++部分ok了,現在來調用咯。
package com.xzw.firstndk; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { TextView resultText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); resultText = (TextView)findViewById(R.id.result); //調用c++的輸出,顯示出來 resultText.setText(NativeUtils.getWords()); } static{ System.loadLibrary("FirstNDK"); } }
完成了,默認生成的是armeabi架構的so文件,如果需要生成多中架構的支持的so,需要在jni目錄下創建Application.mk文件。
APP_ABI :=armeabi armeabi-v7a x86
添加好了,運行起來就可以在libs目錄下看到這幾個架構的文件夾了。搞定手工了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。