zoukankan      html  css  js  c++  java
  • Linux下安卓ndk混合编译调用so方法——QuickStart学习

    转自:http://www.52pojie.cn/thread-313869-1-1.html

     #注意:.h 和.c中的错误eclipse不会检查,只会调用时在手机或虚拟机中死掉。因此需要仔细检查其中的语法和命名。

    #Java_com_example_testforso_JniGg_ggPrintHello:Java_包名_类名_函数名

    #(JNIEnv * env, jclass this)前两个参数固定。

    system.loadlibrary("so名称"),与android.mk中的LOCAL_MODULE :=  & LOCAL_SRC_FILE := 的值对应 

    x1:新建立一个安卓工程




     


    0x2:编写调用so代码和方法定义

    在MainActivity.java同目录下创建一个JniGg.java文件,用于调用so


    <ignore_js_op> 



    0x3:生成文件头.h文件

    在这个目录可以看到我们编写好并且已经编译的class文件,eclipse是自动编译的。

    <ignore_js_op> 


    一切正常编译,那么现在我们回到工程根目录下:

    <ignore_js_op> 



    然后在命令行切换到此目录:

    <ignore_js_op> 



    现在我们使用下面的命令:javah -classpath bin/classes -d jni com.ggndktest1.JniGg

    <ignore_js_op> 


    不报错,并且成功编译出.h文件,才算成功的。

    上面需要注意的是那个bin/classes,因为我的电脑上编译完的classes目录是这个样子的,参照上文那个文件目录的截图图片,个别电脑上不需要/classes。然后在Eclipse,右击工程,进行刷新,可以看到如下截图:



     

    0x4:编写c代码


     


    在jni目录下新建file,gg-jni.c自己看看代码,也就知道啥意思了


     

    然后就是Android.mk文件的编写了


     


    0x5:生成so文件


     


    切换到工程根目录,然后直接ndk-build即可。这里需要注意,ndk-build需要配置环境变量,自行搜索配置方法即可。


    0x6:android调用代码


     


    新建一个TextView,然后显示so里面的字符串。然后运行我们的测试代码:


     



    最后代码
     1 /* DO NOT EDIT THIS FILE - it is machine generated */
     2 #include <jni.h>
     3 /* Header for class com_example_testforso_JniGg */
     4 
     5 #ifndef _Included_com_example_testforso_JniGg
     6 #define _Included_com_example_testforso_JniGg
     7 #ifdef __cplusplus
     8 extern "C" {
     9 #endif
    10 /*
    11  * Class:     com_example_testforso_JniGg
    12  * Method:    ggPrintHello
    13  * Signature: ()Ljava/lang/String;
    14  */
    15 JNIEXPORT jstring JNICALL Java_com_example_testforso_JniGg_ggPrintHello
    16   (JNIEnv *, jclass);
    17 
    18 JNIEXPORT jint JNICALL Java_com_example_testforso_JniGg_getCoin
    19   (JNIEnv *, jobject);
    20 
    21 #ifdef __cplusplus
    22 }
    23 #endif
    24 #endif
     1 #include "com_example_testforso_JniGg.h"
     2 
     3 JNIEXPORT jstring JNICALL Java_com_example_testforso_JniGg_ggPrintHello
     4   (JNIEnv * env, jclass this)
     5 {
     6     return (*env)->NewStringUTF(env, "Hello!!!");
     7 }
     8 
     9 JNIEXPORT jint JNICALL Java_com_example_testforso_JniGg_getCoin
    10 (JNIEnv * env, jobject this)
    11 {
    12     int c=100;
    13 
    14     return c;
    15 }
     1 package com.example.testforso;
     2 
     3 public class JniGg {
     4     static {
     5         System.loadLibrary("gg-jni");
     6     }
     7     
     8     static public native String ggPrintHello();
     9     static public native int getCoin();
    10 }
     1 TextView tview;
     2     @Override
     3     protected void onCreate(Bundle savedInstanceState) {
     4         super.onCreate(savedInstanceState);
     5         setContentView(R.layout.activity_main);
     6         
     7         tview=(TextView) this.findViewById(R.id.coin);
     8         
     9         tview.setText(JniGg.ggPrintHello()+JniGg.getCoin());
    10     }








    相关附件和文档:
    http://pan.baidu.com/s/1pJ2Y047

  • 相关阅读:
    第一章 初识shiro
    LDAP概念
    css定位
    css随笔1
    自己动手实现信息检索系统
    IntelliJ IDEA和pycharm注册码
    俄罗斯农夫算法
    [NOIP2013]转圈游戏
    [codevs1287]矩阵乘法
    [洛谷1314]无序字母对
  • 原文地址:https://www.cnblogs.com/zl1991/p/5160306.html
Copyright © 2011-2022 走看看