<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之旅 廣告
                ### jni開發中的常見錯誤 #### 錯誤一 :java.lang.UnsatisfiedLinkError: Native method not found:(本地方法沒有找到原因) - java.lang.UnsatisfiedLinkError: Native method not found: - 1. 本地函數名寫錯,如果本地方法名中有下劃線“_”,則聲明時,.c文件中在最后一個下劃線后面加1,如以下代碼所示 如果不加1會出現以下錯誤 ``` 07-20 23:00:15.542: E/AndroidRuntime(1307): Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.wsc.jnihelloworld.MainActivity.hello_FromC:()Ljava/lang/String; ``` ![](http://i.imgur.com/Q1w9GRH.png) 如果后面加1,如下圖所示 MainActivity.class中修改如下 ![](http://i.imgur.com/H0oZAG5.png) hello.c中修改如下 ![](http://i.imgur.com/MXgicX1.png) 再重新編譯生成.so文件,運行到模擬器上,正常運行 **虐心2** 如果遇到這種情況,方法名命名及其腦殘如下圖所示: ![](http://i.imgur.com/ee36h88.png) 這時,人工修改本地函數名,很麻煩,這時可以使用javah -jni命令,生成頭文件 如果是jdk1.7版本則來到項目的src目錄下運行javah命令,如果是jdk1.6版本,則到項目的bin目錄下的class目錄下運行javah命令 ![](http://i.imgur.com/Jpko7XP.png) 盡管報了GBK錯誤,但是那是編碼格式的問題,不影響 本地方法聲明在哪一個類中,就把這個類的全類名拿來,復制粘貼到DOS中 javah 后面,在項目文件鼠標移動到該處,按住F5刷新一下,就會出現頭文件,打開可以看到 ![](http://i.imgur.com/rqImKmB.png) 打開頭文件可以看到javah命令生成的頭文件 ![](http://i.imgur.com/QsDSTJj.png) 這樣就可以直接拿到本地函數名,不用人工修改本地函數名 - 2.忘記加載.so文件,沒有調用System.loadlibrary() - System.loadlibrary()一般并不是調用它的時候才加載這個函數,可以在MainActivity中寫一個靜態代碼塊,MainActivity實例已創建,就加載.so文件 ####錯誤二 : findLibrary returned null #### - findLibrary returned null - 1.加載動態鏈接庫時,動態鏈接庫名字寫錯 System.loadLibrary("libhello");//動態鏈接庫名字錯了 報錯如下 07-21 04:59:47.232: E/AndroidRuntime(1475): java.lang.UnsatisfiedLinkError: Couldn't load libhello from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.wsc.jnihelloworld-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.wsc.jnihelloworld-2, /system/lib]]]: findLibrary returned null - 2.平臺類型錯誤,把只支持arm平臺的.so文件部署到了x86CPU的設備上 報錯如下 07-21 09:08:13.872: E/AndroidRuntime(1917): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load hello from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.wsc.jnihelloworld-1.apk,libraryPath=/data/app-lib/com.wsc.jnihelloworld-1]: findLibrary returned null Application.mk 中有這樣一段話 By default, the NDK build system will generate machine code for the 'armeabi' ABI. This corresponds to an ARMv5TE based CPU with software floating point operations. You can use APP_ABI to select a different ABI. 默認情況下,NDK 生成系統將生成 'armeabi' ABI 的機器代碼。這對應于 ARMv5TE 基于 CPU 浮點運算的軟件。您可以使用 APP_ABI 來選擇不同的 ABI。 沒有指定APP_ABI,則它只去編譯支持armeabi這種CPU的機器代碼,想支持其他平臺,就要添加APP_ABI指定想要支持的平臺,支持多個平臺時,用空格隔開,比如: APP_ABI := armeabi x86 **注意:genymotion模擬器應該都是支持x86CPU平臺,所以APP安裝到這些模擬器,應該注意指定APP_ABI** 重新ndk-build生成x86平臺下的.so文件如圖,然后運行到x86模擬器 ![](http://i.imgur.com/BRSSsFj.png) ### cpu平臺 ### * arm :指令集,精簡指令集,簡單的事情,效率特別高, * 優點:移動平臺,執行簡單的指令操作,效率高,資源消耗低,功耗低。 * 缺點:復雜邏輯的時候,就有缺陷。 * 發展:arm平臺的服務器 * x86:復雜指令集,SSE,SSE3 * 優點:執行復雜業務邏輯的時候,性能非常強大,這種性能遠超arm平臺 * 缺點:耗電,功耗高。 * 發展:x86 平臺手機cpu,x86:聯想的k900,拉攏一些山寨廠商使用x86 cpu * mips:cpu 類型 * 龍芯:用mips * sigma:機頂盒 ### javah ### - jdk 1.7項目 src目錄下運行 javah - jdk 1.6項目 bin目錄下classes文件夾 - javah native方法聲明的java類的全類名 從上圖可以看到在ndk-build時,出現一個warning,說APP_PLATFORM ,Android-19比最小版本14大,解決這個warning可以在Application.mk中添加 APP_PLATFORM := android-14 ![](http://i.imgur.com/eder0Dh.png) 可以看到,不再報這個warning ####錯誤三: 使用javah生成頭文件報找不到類文件 #### 很有可能是由你的JDK環境變量配置出錯,記住CLASSPATH這個系統變量,前面應該加上“.;”,如圖所示 ![](http://i.imgur.com/X3oPrFk.png)
                  <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>

                              哎呀哎呀视频在线观看