studio写jniHelloWorld的步骤
1. 创建一个项目
2. 创建一个java项目例如myJNI
1. 类中声明一个本地方法:
2. 声明链接 这样才能在java代码中调用c
代码如下:
public class myJNI {
static {
System.loadLibrary("hello"); //加载动态链接库
}
public static native String helloFromC();
}
3. 在Terminal中进行命令行操作
1. 进入myJNI所在的文件夹下 cd app\src\main\java\com\wal\jni
2. 对于myJNI.java进行编译,生成class文件 javac myJNI.java
3. 退回到com的上一层
4. 用myJNI.class生成javah文件
4. 创建c文件
1. 在main文件夹下创建文件夹 例如 : jni
2. 在jni中创建c文件,文件名为hello(要与2.2中声明的相同)
3. c文件中写代码,先将h文件中生成的头考过来.注:虽然h文件不影响运行,但是方法多的时候可以方便写c文件
#include <jni.h>
JNIEXPORT jstring
JNICALL Java_com_wal_encode_myJNI_encode
(JNIEnv *env, jclass obj, jstring str) {
char *cstr = (*env)->GetStringUTFChars(env, str, 0);
int i;
for (i = 0; i < strlen(cstr); i++) {
*(cstr + i) += 1;
}
return (*env)->NewStringUTF(env, cstr);
}
5. 重要配置
1. 配置ndk路径
2. appbuild.Gradle中配置ndk(defaultConfig节点下)
defaultConfig {
applicationId "com.wal.jni"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "hello" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。
}
}
3. appbuild.Gradle中的android下配置:否则找不到ndk,c文件会报错
sourceSets.main {
jni.srcDirs = []
}
6. 在Mainactivity中进行c的调用(例如输入一个字符串 或弹个土司)
public class MainActivity extends AppCompatActivity {
private String str;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
str = new myJNI().helloFromC();
}
public void click(View view) {
Toast.makeText(this,str,Toast.LENGTH_SHORT).show();
}
}
7. 运行到手机上