jni的環境搭建
最近研究了一下android jni的用法,JNI全稱爲Java Native Interface(JAVA本地調用)。從Java1.1開始,JNI成爲java平臺的一部分,它允許Java代碼和其他語言寫的代碼(如C&C++)
進行交互。並非從Android發佈才引入JNI的概念的。要實現JNI編程,首先要準備工具,我的是平時用的android開發環境,sdk eclipse,另外又下載了一個ndk.
簡單來說,Android的NDK提供了一些交叉編譯工具鏈和Android自帶的庫,這些Android的庫可以讓開發者在編寫本地語言的程序時調用。
而NDK提供的交叉編譯工具鏈就對已經編寫好的C&C++代碼進行編譯,生成庫。
當然了,你也可以自己搭建交叉編譯環境,而不用NDK的工具和庫。然後生成庫,只要規範操作,一樣可以生成能讓JAVA層成功調用的庫文件的。
我是從網上下載的android-ndk32-r10b-windows-x86版本,放到一個文件夾下解壓,注意路徑中儘量不要用中文。
3、JNI 調用流程
1、首先先在eclipse上新建一個工程,命名爲 JniDemo 我是保存在了E:\demo\JniDemo
2、重新創建一個類,我命名爲JniUtils,在這個類裏聲明一個方法
public class JniUtils {
public static native String getStringFromC();
}
3、在MainActivity中引用此方法
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("msg", "ddd:" + JniTest.getStringFromC());
}
}
4、在工程下添加 jni 的文件,新建一個Android.mk文件,我需要交互的是c++語言,我的Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := JniDemo.cpp
include $(BUILD_SHARED_LIBRARY)
若爲C語言交互,Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := JniDemo.c
include $(BUILD_SHARED_LIBRARY)
其中module爲即將生產的.so包名,在java代碼裏需要引用此包名,files是對應要新建的C/C++文件名
添加到Android.mk文件,再繼續在jni文件夾裏添加.c/.cpp文件,文件名爲files對應的名字
5、添加ndk路徑,在eclipse的Windows->Preferences下Android->NDK下有NDK Location選項,選則解壓的ndk的路徑
在eclipse的Project->Properties下選擇Builders下選擇new,在彈窗選擇Program進到設置頁面
Location選擇ndk的路徑\ndk-build.cmd
Working Directory選擇工程所在的目錄
然後選擇第二項Refresh 進行相應配置
選擇第4項Build Options進行相應配置
6、打開工程所在文件夾,進入bin->classes 進入E:\demo\JniDemo\bin\classes\com\example\jnidemo查看是否有native方法
所在文件的.class文件,
cmd運行環境,進到classes所在的目錄,執行javah com.example.jnidemo.JniUtils在classes下回生成.h文件,將此文件
複製到eclipse的jni文件夾下
7、編寫c文件,如下
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_JniUtils_getStringFromC(JNIEnv * env, jclass obj){
//java to c
return env->NewStringUTF("this is c++ code");
}
8、最後在MainActivity中添加引用包
static {
System.loadLibrary("JNIDemo");
}
9、運行,打印出this is c++ code.
進行交互。並非從Android發佈才引入JNI的概念的。要實現JNI編程,首先要準備工具,我的是平時用的android開發環境,sdk eclipse,另外又下載了一個ndk.
簡單來說,Android的NDK提供了一些交叉編譯工具鏈和Android自帶的庫,這些Android的庫可以讓開發者在編寫本地語言的程序時調用。
而NDK提供的交叉編譯工具鏈就對已經編寫好的C&C++代碼進行編譯,生成庫。
當然了,你也可以自己搭建交叉編譯環境,而不用NDK的工具和庫。然後生成庫,只要規範操作,一樣可以生成能讓JAVA層成功調用的庫文件的。
我是從網上下載的android-ndk32-r10b-windows-x86版本,放到一個文件夾下解壓,注意路徑中儘量不要用中文。
3、JNI 調用流程
1、首先先在eclipse上新建一個工程,命名爲 JniDemo 我是保存在了E:\demo\JniDemo
2、重新創建一個類,我命名爲JniUtils,在這個類裏聲明一個方法
public class JniUtils {
public static native String getStringFromC();
}
3、在MainActivity中引用此方法
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("msg", "ddd:" + JniTest.getStringFromC());
}
}
4、在工程下添加 jni 的文件,新建一個Android.mk文件,我需要交互的是c++語言,我的Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := JniDemo.cpp
include $(BUILD_SHARED_LIBRARY)
若爲C語言交互,Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := JniDemo.c
include $(BUILD_SHARED_LIBRARY)
其中module爲即將生產的.so包名,在java代碼裏需要引用此包名,files是對應要新建的C/C++文件名
添加到Android.mk文件,再繼續在jni文件夾裏添加.c/.cpp文件,文件名爲files對應的名字
5、添加ndk路徑,在eclipse的Windows->Preferences下Android->NDK下有NDK Location選項,選則解壓的ndk的路徑
在eclipse的Project->Properties下選擇Builders下選擇new,在彈窗選擇Program進到設置頁面
Location選擇ndk的路徑\ndk-build.cmd
Working Directory選擇工程所在的目錄
然後選擇第二項Refresh 進行相應配置
選擇第4項Build Options進行相應配置
6、打開工程所在文件夾,進入bin->classes 進入E:\demo\JniDemo\bin\classes\com\example\jnidemo查看是否有native方法
所在文件的.class文件,
cmd運行環境,進到classes所在的目錄,執行javah com.example.jnidemo.JniUtils在classes下回生成.h文件,將此文件
複製到eclipse的jni文件夾下
7、編寫c文件,如下
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_JniUtils_getStringFromC(JNIEnv * env, jclass obj){
//java to c
return env->NewStringUTF("this is c++ code");
}
8、最後在MainActivity中添加引用包
static {
System.loadLibrary("JNIDemo");
}
9、運行,打印出this is c++ code.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.