2011-04-14 61 views
44

嗨,任何人都可以建議我一些很好的資源來學習JNI爲Android和一些好的JNI教程?Jni教程爲Android

+12

在我看來,這是由14K的意見,看到一個完全有效的問題。在這種情況下,意見是人們想要閱讀的。工程師們對他們的流程方法持有自己的見解。至於吸引垃圾郵件,stackoverflow顯然可以處理這個小問題。下面的答案是有用的,更有用的答案是這個網站是關於什麼。 – 2014-03-13 12:39:01

+1

谷歌有一個codelab。 https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F ..%2Findex#0 – 2016-09-09 13:20:33

回答

16

我建議下載ndk。解壓縮並瀏覽示例文件夾ndk代碼。從hello-jni開始,繼續前進。它很容易解釋。 您還可以在瀏覽代碼並繼續來回時瀏覽theselinksthis

+0

你可以從我的github頁面找到使用Android Studio的JNI項目:https://github.com/russell-shizhen/JniExample。我試圖儘可能提供有關JNI API使用情況的示例。 – Russell 2017-12-15 06:09:29

41

教程ECLIPSE

這裏是firstsecond小教程,但如果你想編寫使用JNI一個簡單的程序,您可以繼續閱讀:)

創建Android應用程序的項目,一旦您的項目已創建,您需要在項目的頂層內創建一個新文件夾。要做到這一點,請右鍵單擊您的項目名稱→新建→文件夾。將該文件夾命名爲jni。比添加類名稱SquaredWrapper。添加這些代碼

package org.edwards_research.demo.jni; 

public class SquaredWrapper { 
    // Declare native method (and make it public to expose it directly) 
    public static native int squared(int base); 

    // Provide additional functionality, that "extends" the native method 
    public static int to4(int base) 
    { 
     int sq = squared(base); 
     return squared(sq); 
    } 

    // Load library 
    static { 
     System.loadLibrary("square"); 
    } 
} 

打開終端。您必須編譯這些代碼才能獲取頭文件。首先調用這個命令。

cd srC# change into the source directory 
javac -d /tmp/ org/edwards_research/demo/jni/SquaredWrapper.java 

cd /tmp 
javah -jni org.edwards_research.demo.jni.SquaredWrapper 

所以你必須在你的tmp目錄下名爲頭文件。

它必須是這樣的

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class org_edwards_research_demo_jni_SquaredWrapper */ 

#ifndef _Included_org_edwards_research_demo_jni_SquaredWrapper 
#define _Included_org_edwards_research_demo_jni_SquaredWrapper 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  org_edwards_research_demo_jni_SquaredWrapper 
* Method: squared 
* Signature: (I)I 
*/ 
JNIEXPORT jint JNICALL Java_org_edwards_1research_demo_jni_SquaredWrapper_squared 
    (JNIEnv *, jclass, jint); 

#ifdef __cplusplus 
} 
#endif 
#endif 

改變這些名字對於一些短單爲您提供舒適,例如square.h。將此頭文件複製到應用程序的jni文件夾中。在相同的文件夾中創建square.c文件,將其複製到它。

#include "square.h" 

JNIEXPORT jint JNICALL Java_com_example_android_1jni_1second_1demo_SquaredWrapper_squared 
     (JNIEnv * je, jclass jc, jint base) 
    { 
      return (base*base); 
    } 

中添加這是你的MainActivity.java

int x = SquaredWrapper.to4(2); 
     x = x*2; 

添加Android.mk文件夾jni這身

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := squared 
LOCAL_SRC_FILES := square.c 

include $(BUILD_SHARED_LIBRARY) 

必須創建頁眉和cpp文件庫。

所以你只需要通過查看我的first鏈接 來完成一些配置現在你可以編譯它了,確保你的庫已經創建好了,並且你的lib目錄包含它。

教程以瞭解Android Studio

讓我們看看你有由Android工作室

第1步打開簡單的Android應用程序:由Android Studio中打開您的應用程序

第2步:下載NDK並在您的應用程序的本地屬性(android sdk路徑的下方/上方)中設置NDK的路徑ndk.dir=C\:\\Android\\android-ndk-r10e

P.S.窗戶雙//,對於Linux一個/

第三步:添加JNI文件夾中的應用程序(右鍵單擊應用程序 - >新建 - >文件夾 - >文件夾JNI)

第4步套裝了Gradle通過這種方式:

app/build.gradle添加該代碼開始NDK

sourceSets.main { 
     jni.srcDirs = [] 
     jniLibs.srcDir 'src/main/libs' 
    } 

    tasks.withType(NdkCompile) { // disable automatic ndk-build call 
    compileTask -> compileTask.enabled = false 
    } 

    task ndkBuild(type: Exec) { // call ndk-build(.cmd) script 
     if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
      commandLine 'cmd', '/c', 'ndk-build.cmd', '-C', file('src/main').absolutePath 
     } else { 
      commandLine 'ndk-build', '-C', file('src/main').absolutePath 
     } 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 

第4步:

本機構創建文件Android.mk和Application.mk在應用程序的文件夾JNI:

Android.mk

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := main 
LOCAL_SRC_FILES := main.cpp 

include $(BUILD_SHARED_LIBRARY) 

Application.mk

APP_ABI := all 
include $(BUILD_SHARED_LIBRARY) 

在APP_ABI中,您可以選擇使用哪些編譯器。它

第5步:

我們必須手動運行NDK我們從build.config禁用它。有關創建com_example_nativedemo_app_MainActivit.h文件中的src \主\ JN文件夾,我們必須運行終端

javah -d .\jni -classpath C:\Intel\INDE\IDEintegration\android-sdk-windows\platforms\android-21\android.jar;..\..\build\intermediates\classes\debug com.example.mydemo.nativedemo.MainActivity 

窗戶在cmd你必須給文件的完整路徑此命令。 對於

第6步:在JNI文件夾

添加文件main.cpp的這身搭配:

#include <string.h> 
#include <jni.h> 
#include <vchat_cpptest_Hellojnicpp.h> 

extern "C" { 
     JNIEXPORT jstring JNICALL 
     Java_vchat_cpptest_Hellojnicpp_stringFromJNI 
     (JNIEnv *env, jobject obj) 
     { 
      #ifdef __INTEL_COMPILER_UPDATE 
       return env->NewStringUTF("Hello from Intel C++ over JNI!"); 
      #else 
       return env->NewStringUTF("Hello from default C++ over JNI!"); 
      #endif 
}