JNI由浅入深_3_HelloWorld - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

JNI由浅入深_3_HelloWorld

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:48

1、须要预备的对象,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk.


  在cygwin的etc目次下将ndk的路径惹人到profile文件中,可以在cygwin的任何目次都可以拜访到ndk,不合的ndk路径PATH的写法不合.
  : ${ORIGINAL_PATH=${PATH}}
  if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then
    PATH="/usr/local/bin:/cygdrive/d/cgwin/android-ndk-r7b:/usr/bin${PATH:+:${PATH}}"
  else
    PATH="/usr/local/bin:/usr/bin:/cygdrive/d/cgwin/android-ndk-r7b"
  fi

2、开辟步调:
a.创建一个android工程
b.JAVA代码中写声明 native 办法 public native String helloFromJNI(); 经由过程javah  包名.类名生成jni的办法签名
c. 创建jni目次,编写c代码,办法名字要对应。或者将生成的签名文件拷贝到jni目次,然后在c代码中惹人。
d.编写Android.mk文件
e.Ndk编译生成动态库( ndk -build )
f.Java代码load 动态库.调用native代码

  2.1 创建一个Android项目,创建native办法.


public class MainActivity extends Activity {
    static{
        //加载二进制文件
        System.loadLibrary("Hello");//libHello.so 去掉落lib和so
    } 
    public native String helloFormC();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("------------"+helloFormC());
    }

}

2.2 javah敕令生成签名


进入到项目标bin/classes敕令下,履行敕令 javah com.example.jni.MainActivity,将生成的头文件拷贝到jni目次下,在c文件中惹人头文件 #include "com_example_jni_MainActivity.h" 。下面是javah敕令的参数 和 临盆头文件方法。
[img]http://images.cnitblog.com/i/502866/201405/311052014161494.png
[img]http://images.cnitblog.com/i/502866/201405/311052170256324.png
 在应用javah敕令时如不雅碰到找不到Activity类,解释android的jar包没有导入进去,一种办法将jar包参加到classpath路径中去,classpath   .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\tools.jar;E:\developLib\android\platforms\android-8\android.jar;另一种办法是在window敕令窗口履行:D:\project3\JNIAndroid>set classpath=D:\project3\JNIAndroid\src。

   2.3 创建C文件


jobject  就是当前办法地点的类代表的对象.JNIEnv类型代表了java情况 经由过程JNIEnv* 指针,就可以对java端的代码进行操作.
#include <stdio.h>
#include <jni.h>
#include <malloc.h>
#include "com_example_jni_MainActivity.h";

JNIEXPORT jstring JNICALL Java_com_example_jni_MainActivity_helloFormC
  (JNIEnv * env, jobject obj){

    return (*env)->NewStringUTF(env,"hello from c ... ");
}

  2.4 编译


经由过程cygwin编译c文件,进入到项目目次,我的项目名称是jni,进入之后履行“ndk-build”敕令,出现如下图所示表示履行成功。
[img]http://images.cnitblog.com/i/502866/201405/311055211036387.png

  2.5 创建Android.mk文件


须要将hello-jni调换成本身的c文件模块名称,在ndk中的地位 file:///D:/cgwin/android-ndk-r7b/docs/ANDROID-MK.html:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    :=Hello
LOCAL_SRC_FILES :=Hello.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)

LOCAL_LDLIBS += -llog表示在jni中打印日记信息,次信息在android控制台上可以看到。须要在c文件中参加如下代码:
#include <android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

2.6 在android项目中的java文件惹人编译生成的二进制文件。


static{
        //加载二进制文件
        System.loadLibrary("Hello");//libHello.so 去掉落lib和so
}

  2.7 最后安排项目,运行。

相关案例查看更多