1. Eclips添加Google 提供的 NDK 最新版工具 ndk-build.com
a. 需要添加 ../ndk 到环境变量
b. 首先新建一个工程 NDKTest
Project(你自己建的工程)->Builders->new->Program
1)Name 自己添加
2)Location:选择 E:\Android\ndk\ndk-build.cmd (ndk下的build.cmd)
3)Workding Directory :选择你自己的工程(如:${workspace_loc:/HelloJni/src/com/example/hellojni})
4)Refresh 选项卡:勾选Refresh resources upon completion, The entire workspace, Recursively include sub-folders
5)Build Option 选项卡:勾选 Allocate Console , After a Clean, During manual builds
至此Eclipse 配置完成;
2. Eclips添加cygwin来编译jni
a. 需要添加cygwin/bin 的环境变量;
b. 其它设置同1,在main 窗口设置
Location: C:\CygwinPortable\App\Cygwin\bin\bash.exe
Workding Directory: ${workspace_loc:/com.example.hellojni.HelloJni}
Arguments: --login -c "cd /cygdrive/e/android/code/com.example.hellojni.HelloJni && $NDK/ndk-build"
为路径名,最后这个一定要更改
3.
a)在工程下面新建 jni 文件夹
b) 修改activity
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = new TextView(this);
tv.setText(stringFromJNI());
setContentView(tv);
}
public native String stringFromJNI(); // c 函数
public native String unimplementedStringFromJNI();
static
{
System.loadLibrary("NDKTest"); // 加载库方式
}
}
函数 public native String stringFromJNI() 则是要调用的C语言函数,编译工程,此时编译工程会出错;
c) 用命令行方式进入 项目根目录, 执行 javah -jni -classpath bin/classes -d jni com.example.ndktest.MainActivity(此处必须包含报名) ,那么根据bin/classes 目录下的.class文件 会在 jni 目录下生成 com_example_ndktest_MainActivity.h
这个.h 文件,该文件方便来写.c 程序,可以获得函数类型及其参数,当然此步熟悉的话可以不做;
为了方便建2个.bat文件, cmd.bat :@call cmd.exe ; jni.bat : javah -jni -classpath bin/classes -d jni %1 %2;
那么执行的时候,先运行 cmd.bat,然后 jni com.example.ndktest.MainActivity 即可
d) 编写jni 程序
i:在jni文件夹下建 Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NDKTest
LOCAL_SRC_FILES := ndk_test.c
include $(BUILD_SHARED_LIBRARY)
ii: 建立 ndk_test.c
#include <string.h>
#include <jni.h>
#include "com_example_ndktest_MainActivity.h"
// 此处函数为了方便,从com_example_ndktest_MainActivity.h 获得
// JNIEXPORT jstring JNICALL Java_com_example_ndktest_MainActivity_stringFromJNI (JNIEnv *, jobject);
// 去掉函数声明的
// JNIEXPORT
// JNICALL
jstring
Java_com_example_ndktest_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
然后编译工程,将生成一个libs\armeabi\libNDKTest.so 该文件就是 .java文件中
System.loadLibrary("NDKTest"); 用到的,记住一定要去掉 lib ,没有后缀
5. 如果要用windows 上面编译JNI 的 .c 文件为动态链接库
命令:cl -I C:\Java\include -I C:\Java\include\win32 -LD your_cfile.c -Feyour_file.dll (-Fe不要忘了)
如果提示找不到 jni.h, 解决办法
a. %JAVA_HOME%\include 找到 jni.h
b. %JAVA_HOME%\include\win32 找到 jni_md.h
c. 将以上两个文件拷贝到 Vstudio 目下VC\include 下即可