Ubuntu下NDK環境搭建以及使用


1.下載並解壓ndk到任意目錄。

2.根據ndk解壓目錄配置環境變量。

在終端輸入vim .hashrc,在最后配置如下:

 

然后“Esc”退出編輯狀態,“Shift + :”使終端接受編譯器命令,“wp”保存,“q!”或“Ctrl + Z”退回到終端界面,環境變量添加完成。這里注意要重啟終端后才會生效。

3.在終端輸入ndk-build,如顯示如下則環境搭建成功。

4.使用時,先創建java代碼,如下:

public class JnitestMainActivity extends Activity {
       private EditText edittext;
       private TextView textview;
       private Button btn;    
    
       private native int myFun(int n);
       static {
               System.loadLibrary("jnitest");
       }

       @Override
       protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_jnitest_main);
        
    edittext = (EditText)findViewById(R.id.edit_text);
    textview =(TextView)findViewById(R.id.text_view);
    btn = (Button)findViewById(R.id.button);
    btn.setOnClickListener(new OnClickListener() {
            
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    String content = edittext.getText().toString();
    int n;
    if(!content.equals("")){
            n = Integer.valueOf(content);//ok
            textview.setText(content + "!" + "=" +myFun(n));
            }
     }
        });
}

 

然后編譯該工程使產生 JnitestMainActivity.class文件,供下一步產生.h文件使用。

5.產生頭文件,先在工程中創建jni文件夾,在終端進入工程目錄,輸入javah -classpath bin/classes -d jni com.test.jnitest.JnitestMainActivity

,具體意義可以用javah –help指令察看,需要說明的是-classpath對應的參數應該為com文件夾所在目錄,有的可能是bin。

生成的頭文件為:com_test_jnitest_JnitestMainActivity.h

內容是:

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

#ifndef _Included_com_test_jnitest_JnitestMainActivity
#define _Included_com_test_jnitest_JnitestMainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_jnitest_JnitestMainActivity
 * Method:    myFun
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_test_jnitest_JnitestMainActivity_myFun(
        JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

 

JNIEnv*, jobject是所有jni函數必有的兩個參數,分別表示jni環境和對應的java類(或對象)本身

6.編寫相應的.c文件,先把上面的函數拷過來,刪掉JNIEXPORT和 JNICALL,具體如下:

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

jint factorial(jint n) {
    if (n == 1) {
        return 1;
    }
    return factorial(n - 1) * n;
}

jint Java_com_test_jnitest_JnitestMainActivity_myFun(JNIEnv * env,
        jobject this, jint n) {
    return factorial(n);//求階乘
}

完成.c文件后com_test_jnitest_JnitestMainActivity.h就沒用了,可刪除。

7.編寫Android.mk文件,具體如下:

LOCAL_PATH := $(call my-dir)//必須有

 

include $(CLEAR_VARS)//清除LOCAL開頭的變量

 

LOCAL_MODULE := jnitest//要生成的庫文件

LOCAL_SRC_FILES := jnitest.c//需要編譯的C源文件

 

include $(BUILD_SHARED_LIBRARY)//編譯成一個共享庫

該腳本還有其他宏,感興趣可以研究下。

8.編譯生成.so共享庫文件,進入工程目錄,輸入ndk-build命令,就會在libs/armeabi目錄下生成libjnitest.so,重新編譯工程,libjnitest.so共享庫會一起打包在apk文件內。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM