<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                較新的NDK版本是r10b,Android Studio對NDK開發的支持還處于構思階段,所以很多工作比如用javah生成頭文件等工作還要自己做。今天用一個例子來演示AS中的NDK開發。 ## 新建一個項目SecondNdkTest 在此項目中新建一個Module叫ndklibrary,作為so庫單獨劃出來。在library中新建一個java類SecondLib,內容如下: ~~~ package com.linc.ndklibrary; /** * Created by linc on 15-3-29. */ public class SecondLib { // Native implementation static { System.loadLibrary("SecondLib"); } //int array public static native int[] intMethod(); //string array public static native String[] stringMethod(); } ~~~ Build—>Make Module’ndklibrary’,這樣SecondLib就編譯完成了,通過SecondLib.class,用javah生成C的頭文件,如下: ~~~ AndroidStudioProjects/SecondNdkTest/ndklibrary/src/main$ javah -d jni -classpath ../../build/intermediates/classes/debug com.linc.ndklibrary.SecondLib AndroidStudioProjects/SecondNdkTest/ndklibrary/src/main$ ls AndroidManifest.xml java jni res AndroidStudioProjects/SecondNdkTest/ndklibrary/src/main$ ls jni/ com_linc_ndklibrary_SecondLib.h ~~~ 頭文件內容如下: ~~~ /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_linc_ndklibrary_SecondLib */ #ifndef _Included_com_linc_ndklibrary_SecondLib #define _Included_com_linc_ndklibrary_SecondLib #ifdef __cplusplus extern "C" { #endif /* * Class: com_linc_ndklibrary_SecondLib * Method: intMethod * Signature: ()[I */ JNIEXPORT jintArray JNICALL Java_com_linc_ndklibrary_SecondLib_intMethod (JNIEnv *, jclass); /* * Class: com_linc_ndklibrary_SecondLib * Method: stringMethod * Signature: ()[Ljava/lang/String; */ JNIEXPORT jobjectArray JNICALL Java_com_linc_ndklibrary_SecondLib_stringMethod (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif ~~~ ## Native代碼實現 在jni目錄中新建c文件SecondLib.c與頭文件對應,分別實現上述兩個方法,內容如下: ~~~ #include "com_linc_ndklibrary_SecondLib.h" const static int length=10; //int array JNIEXPORT jintArray JNICALL Java_com_linc_ndklibrary_SecondLib_intMethod (JNIEnv *env, jclass obj) { jintArray array; array=(*env)->NewIntArray(env,10); int i=1; for(;i<=10;++i) { (*env)->SetIntArrayRegion(env,array,i-1,1,&i); } //get array length int len=(*env)->GetArrayLength(env,array); //array content jint* elems=(*env)->GetIntArrayElements(env,array,0); return array; } //string array JNIEXPORT jobjectArray JNICALL Java_com_linc_ndklibrary_SecondLib_stringMethod (JNIEnv *env, jclass obj) { jclass class=(*env)->FindClass(env,"java/lang/String"); jobjectArray string=(*env)->NewObjectArray(env,(jsize)length, class,0); jstring jstr; char* _char[]={"my ","name ","is ", "linc!!","正在","學習", "JNI","和","NDK","技術!" }; int i=0; for(;i<length;++i) { jstr=(*env)->NewStringUTF(env,_char[i]); (*env)->SetObjectArrayElement(env,string,i,jstr); } return string; } ~~~ ## 編譯 在local.properties中加入ndk路徑: ~~~ ndk.dir=/opt/ndk/android-ndk-r10b ~~~ 然后在ndklibrary的build.gradle中defaultConfig中加入ndk定義,如下: ~~~ defaultConfig { minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" ndk{ moduleName "SecondLib" } } ~~~ 這樣就可以直接編譯了,不用自己編寫make文件了。? Build—>Make Module’ndklibrary’,生成的so如下: ~~~ AndroidStudioProjects/SecondNdkTest$ find -name *.so ./ndklibrary/build/intermediates/ndk/debug/lib/armeabi/libSecondLib.so ./ndklibrary/build/intermediates/ndk/debug/lib/armeabi-v7a/libSecondLib.so ./ndklibrary/build/intermediates/ndk/debug/lib/mips/libSecondLib.so ./ndklibrary/build/intermediates/ndk/debug/lib/x86/libSecondLib.so ./ndklibrary/build/intermediates/ndk/debug/obj/local/armeabi/libSecondLib.so ./ndklibrary/build/intermediates/ndk/debug/obj/local/armeabi-v7a/libSecondLib.so ./ndklibrary/build/intermediates/ndk/debug/obj/local/mips/libSecondLib.so ./ndklibrary/build/intermediates/ndk/debug/obj/local/x86/libSecondLib.so ~~~ 注:? 至于直接在Activity中用native的方法請參考下面的前兩個鏈接。我遇到了問題沒有得到解決: ~~~ $ javah -d jni -classpath /opt/sdk/platforms/android-5.1/android.jar;../../build/intermediates/classes/debug com.linc.secondndktest.MainActivity Error: no classes specified bash: ../../build/intermediates/classes/debug/: Is a directory ~~~ 參考:? [http://blog.csdn.net/rznice/article/details/42295215](http://blog.csdn.net/rznice/article/details/42295215)? [http://blog.csdn.net/sodino/article/details/41946607](http://blog.csdn.net/sodino/article/details/41946607)? [http://stackoverflow.com/questions/10483959/javah-error-android-app-activity-not-found](http://stackoverflow.com/questions/10483959/javah-error-android-app-activity-not-found)? [http://blog.csdn.net/lincyang/article/details/6705143](http://blog.csdn.net/lincyang/article/details/6705143)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看