初次接触,一头雾水。然而做下来之后,也是很简单的,按步骤来就行
这次是接到一个Android 通过wifi控制硬件的项目,没做过啊,什么事情都有个开始的,先实现Android和c的通信:
- 首先给Android Studio配置ndk环境,这个网上很多,就不多说了
- 配置工程ndk属性
- 配置项目ndk属性
- 写一个java类,作用是加载生成的库文件和声明需要实现的方法(方法会用c实现,Android 调用)
- 使用AS编译器Terminal编译java类,生成.h文件
- 在main文件夹下创建jni文件夹,新建.c文件,复制.h的内容到.c,并实现文件中对应方法
- 在Android代码中调用
具体实现
1,配置工程ndk,在工程的gradle.properties下添加:android.useDeprecatedNdk=true
2,配置项目ndk,在module的build.gradle中,defaultConfig之下, ( moduleName “MyJni”的值和java类中 System.loadLibrary(“MyJni”)一致)
defaultConfig {
applicationId “–.–.–”
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName “1.0”
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk{
moduleName "MyJni"
}
}
3,新建一个java,可以在包名下新建,也可以是别的路径
public class MyJni {
static {
System.loadLibrary(“MyJni”);
}
public static native String getWorld();
}
4,打开AS的terminal,进到项目的main/java路径,cd E:\android\application\project\MyJniTest\src\main\java,执行javah -jni package(包名).MyJni,这里需要注意MyJni路径;执行完生成一个.h文件,
5,在src/main之下创建jni文件夹,在jni下新建myctest.c,名字自己定义,实现里面的方法
JNIEXPORT jstring JNICALL Java_com_xhs_jni_jni_MyJni_getWorld
(JNIEnv *env, jclass object){
return (*env)->NewStringUTF(env,”就是这样的”);
};
6,在Android 中调用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView text1 = (TextView) findViewById(R.id.text1);
MyJni myJni = new MyJni();
text1.setText(myJni.getWorld());
}
}