Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1547574
  • 博文数量: 596
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 173
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 15:50
个人简介

在线笔记

文章分类

全部博文(596)

文章存档

2016年(1)

2015年(104)

2014年(228)

2013年(226)

2012年(26)

2011年(11)

分类: Android平台

2014-11-13 17:22:48

1. 加载库的函数
java.lang.UnsatisfiedLinkError: Library foo not found

是 System.loadLibrary("jni");
不是System.load("jni");

2. 库的名字
libjni.so -> jni

3. jni的函数名
完全按照:java_pacakege_class_method 形式来命名。
java_com_example_jni_MainActivity_GetString();

  1. //java
  2. package com.example.jni;

  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.Menu;
  6. import android.view.MenuItem;
  7. import android.widget.TextView;

  8. public class MainActivity extends Activity {

  9.     @Override
  10.     protected void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         TextView tv = new TextView(this);
  13.         tv.setText(GetString());
  14.         setContentView(tv);
  15.     }
  16.     
  17.     public native String GetString();
  18.     
  19.     static {
  20.         System.loadLibrary("jni");
  21.     }
  22. }

  23. //c
  24. #include <jni.h>
  25. #include <string.h>
  26. #ifdef __cplusplus

  27. extern "C" {

  28. #endif
  //java_pacakege_class_method 
  1. jstring
  2. Java_com_example_jni_MainActivity_GetString( JNIEnv* env,
  3.                                                   jobject thiz )
  4. {
  5.     return env->NewStringUTF( "Hello from JNI ! Compiled with ABI " );
  6. }
  7. #ifdef __cplusplus

  8. }

  9. #endif


一些问题与解决方法:

问题一:Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml    (这个是NDK工具的一个BUG,若build Target大于minSdkVersion,则会报这个错误,导致无法运行)
解决方法:
android-ndk-r8e/build/core/add-application.mk第128行把__ndk_warning改为__ndk_info;然后重新build一次项目即可消除错误。
原文:
this problem may be safely fixed by changing this line in add-application.mk from __ndk_warning to __ndk_info
链接:



问题二:使用c++来编写本地库,会有一些兼容问题。

(1)直接黏贴HelloJni的stringFromJNI函数过来测试,提示Method 'NewStringUTF' could not be resolved
解决方法

改为:将(*env)->NewStringUTF(env, "Hello from JNI !")改为return env->NewStringUTF("Hello from JNI !")即可

原因是:

NDK plugin默认为我们生成的是cpp文件,而C与C++调用函数的参数不一致,因此找不到函数,具体参考jni.h中的定义。cpp文件中形如(*env)->Method(env, XXX)改成env->Method(XXX)即可。

(2)运行c++生成的.so库,若报以下错误:(既找不到函数)

No implementation found for native Lcom/dgut/android/MainActivity;.stringFromJNI ()Ljava/lang/String;

java.lang.UnsatisfiedLinkError: stringFromJNI

at com.dgut.android.MainActivity.stringFromJNI(Native Method)

  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. //
  5. #ifdef __cplusplus
  6. }
  7. #endif


阅读(952) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~