在Android平台上必然是要用到JNI来进行开发的,倒腾了很久终于实现了JNI的开发,现记录下来。
第一步:配置NDK变量(只需要设置一次即可)(Windows-Preferences-Android-NDK)
第二步:添加本地的native方法(这里我将native方法写到了Activity中,也可以单独写一个类来添加本地的native方法)
public class MainActivity extends Activity {
private native String getString();
}
- 1
第三步:选中工程后右键,选择Android Tools -> add Native Support(需要关联源码否则可能会报错)
此时新建的工程就多了一个jni目录
注意:IDE有可能会报一个错误
17:08:36 - Unable to launch cygpath. Is Cygwin on the path?] java.io.IOException: Cannot run program “cygpath”: CreateProcess error=2
1.工程右键,选择properties-C/C++ Build-environment,选择Add,添加一个NDK环境变量
2.工程右键,选择properties-C/C++ Build,选择Builder Settings选项卡,取消勾选Use default build command,使用配置:${NDK}/ndk-build.cmd脚本文件
这时再去Clean工程就不会报错了
第四步:下面就来编写JNI的C/C++文件,需要导入头文件。
工程右键,选择properties -> C/C++ General -> Paths and Symbols, 选择includes选项卡,点击Add,选择File System,导入头文件(如下截图中我已经添加过)
第五步:接下来就是编写C/C++代码
#include <string.h>
#include <jni.h>
extern "C" { //c++中需加入
jstring Java_com_example_jnitest_MainActivity_getString(JNIEnv* env,jobject thiz){
// c++ 与 c 调用方法不同
return env->NewStringUTF("Hello JNI 我的第一个JNI,c++调用"); // c++调用
//return (*env)->NewStringUTF(env, "Hello JNI 我的第一个JNI,c调用");
}
}
- 1
第六步:Android.mk文件是自动生成的,可以不用修改
第七步:进入C/C++视图,点击上面的锤子,交叉编译生成.so文件
第八步:使用静态代码块,编写System.loadLibrary(“SO库文件名”)来加载库文件
public class MainActivity extends Activity {
private native String getString();
static {
System.loadLibrary("NDKTest");
}
}
- 1
第九步:Activity类调用代码
public class MainActivity extends Activity {
private native String getString();
static {
System.loadLibrary("NDKTest");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((TextView)findViewById(R.id.tv)).setText(getString());//调用jni
}
}
- 1
可以使用C++去开发,也可以使用C去开发,但是需注意区别
1.使用c++时:
对应的NDKTest.cpp文件
#include <string.h>
#include <jni.h>
extern "C" { //c++中需加入
jstring Java_com_example_jnitest_MainActivity_getString(JNIEnv* env,jobject thiz){
// c++ 与 c 调用方法不同
return env->NewStringUTF("Hello JNI 我的第一个JNI,c++调用");
//return (*env)->NewStringUTF(env, "Hello JNI 我的第一个JNI,c调用");
}
}
- 1
对应Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NDKTest
LOCAL_SRC_FILES := NDKTest.cpp
include $(BUILD_SHARED_LIBRARY)
- 1
2.使用c时:
对应的NDKTest.c文件
#include <string.h>
#include <jni.h>
jstring Java_com_example_jnitest_MainActivity_getString(JNIEnv* env,jobject thiz)
{
return (*env)->NewStringUTF(env, "Hello JNI 我的第一个JNI,c调用");
}
- 1
对应Android.mk文件也需修改
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NDKTest
LOCAL_SRC_FILES := NDKTest.c
include $(BUILD_SHARED_LIBRARY)
- 1