234.JNI简单使用eclipse--hello world
作者:互联网
##NDK目录结构
* docs:帮助文档
* build/tools:linux的批处理文件
* platforms:编译c代码需要使用的头文件和类库
* prebuilt:预编译使用的二进制可执行文件
* sample:jni的使用例子
* source:ndk的源码
* toolchains:工具链
* ndk-build.cmd:编译打包c代码的一个指令
使用JNI的方法:
第一步:创建一个app项目,在根目录下面创建一个jni的文件夹
第二步:在jni文件中创建一个c文件
第三步: 在java代码中,创建一个本地方法helloFromC,这个方法的方法体由C语言实现
public native String helloFromC();
第四步: 在jni中定义函数实现这个方法,函数名必须为下面的形式。其中
JNIEnv:是java运行环境的指针,也就是java虚拟机的内存地址
obj:在本地方法中声明的对象引用,是哪个对象调用的(MainActivy),C语言中没有这个,因此直接使用jobject代替对象
//java中准备调用函数的包名+类名+方法名
jstring Java_com_ldw_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)
第五步: 返回一个字符串,用c定义一个字符串
char* cstr = "hello from c";
第六步: 把c的字符串转换成java的字符串
jstring jstr = (*env)->NewStringUTF(env, cstr);
return jstr;
第七步:在jni中创建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#编译生成的文件的类库叫什么名字
LOCAL_MODULE := hello
#要编译的c文件
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)
第八步: 在c文件中添加<jni.h>头文件
第九步:在jni文件夹下执行ndk-build.cmd指令
目录下会生成相应的类库
第十步:java代码中加载so类库,调用本地方法。
引用的so类库是libs/armeabi下面的so文件[libhello.so],掐头去尾,只剩下hello,这样来引用类库
static{
//加载打包完毕的so类库
System.loadLibrary("hello");
}
完整代码
MainActivity.java
package com.ldw.helloworld1;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
static{
//加载打包完毕的so类库
System.loadLibrary("hello");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
Toast.makeText(this, helloFromC(), 0).show();
}
//定义一个本地方法,方法体由c语言实现
public native String helloFromC();
}
01_HelloWorld/jni/Hello.c
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
//java中准备调用函数的包名+类名+方法名
jstring Java_com_ldw_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj){
//c语言的字符串
char* cstr = "hello from c";
//把c语言的字符串转换成java的字符串
//jni.h中对应的方法===》jstring (*NewStringUTF)(JNIEnv*, const char*);
// jstring jstr = (*(*env)).NewStringUTF(env, cstr);
jstring jstr = (*env)->NewStringUTF(env, cstr);
return jstr;
}
标签:类库,jstring,java,eclipse,env,234,world,jni,hello 来源: https://blog.csdn.net/augfun/article/details/88785324