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

原文地址:https://www.cnblogs.com/zl1991/p/5160306.html