其他分享
首页 > 其他分享> > 234.JNI简单使用eclipse--hello world

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