• 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

  • 相关阅读:
    ORA-01045: user XXZY lacks CREATE SESSION privilege; logon denied
    ORA-31626:作业不存在 ORA-31633:无法创建主表"XXX.SYS_IMPORT_FULL_05"
    HTTP 错误 401.3
    mysql 简单游标
    mysql 多重游标嵌套
    表单校验 “灰白字提示”
    Eclipse连接mysql数据库出现问题
    虚拟机无法使用桥接,没有未桥接网络适配器解决办法
    每周进度条(16)
    人月神话阅读笔记06
  • 原文地址:https://www.cnblogs.com/zl1991/p/5160306.html
Copyright © 2020-2023  润新知