配置环境为android-ndk-r8e和sequoyah插件,在Eclipse中通过右键add Support Native添加动态库
在程序中实现一个简单的加法运算,这个加法通过调用C++ 代码实现,但是不成功,我调用C代码可以成功
在MainActivity.java中代码为
package com.example.ndkdemo;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView displayLabel = (TextView)findViewById(R.id.display);
Button btn = (Button)findViewById(R.id.add_btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
double randomDouble =Math.random();
long x = Math.round(randomDouble*100);
randomDouble = Math.random();
long y = Math.round(randomDouble*100);
System.loadLibrary("NDKDemo");
long z= add(x,y);
String msg = x+"+"+y+"="+z;
displayLabel.setText(msg);
}
});
}
public native long add(long x,long y);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
在jni中由插件自动生成了一个NDKDemo.cpp和一个Android.mk我又添加了一个NDKDemo.h文件
在NDKDemo.cpp:
#include "NDKDemo.h"
jlong Java_com_example_ndkdemo_MainActivity_add( JNIEnv *env,jobject this,
jlong x,jlong y)
{
return x+y;}
在NDKDemo.h:#include <jni.h>
#ifndef NDKDEMO_H_
#define NDKDEMO_H_extern "C"{
jlong Java_com_example_ndkdemo_MainActivity_add( JNIEnv* env,jobject this,jlong x,jlong y);}#endif
在Andriod.mk:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := NDKDemo
LOCAL_SRC_FILES := NDKDemo.cppinclude $(BUILD_SHARED_LIBRARY)
错误信息:
Description Resource Path Location Type
expected ',' or '...' before 'this' NDKDemo.h /NDKDemo/jni line 7 C/C++ Problem
'y' was not declared in this scope NDKDemo.cpp /NDKDemo/jni line 7 C/C++ Problem
make: *** [obj/local/armeabi/objs/NDKDemo/NDKDemo.o] Error 1 NDKDemo C/C++ Problem
'x' was not declared in this scope NDKDemo.cpp /NDKDemo/jni line 7 C/C++ Problem
expected ',' or '...' before 'this' NDKDemo.cpp /NDKDemo/jni line 2 C/C++ Problem
C++Native App
在程序中实现一个简单的加法运算,这个加法通过调用C++ 代码实现,但是不成功,我调用C代码可以成功
在MainActivity.java中代码为
package com.example.ndkdemo;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView displayLabel = (TextView)findViewById(R.id.display);
Button btn = (Button)findViewById(R.id.add_btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
double randomDouble =Math.random();
long x = Math.round(randomDouble*100);
randomDouble = Math.random();
long y = Math.round(randomDouble*100);
System.loadLibrary("NDKDemo");
long z= add(x,y);
String msg = x+"+"+y+"="+z;
displayLabel.setText(msg);
}
});
}
public native long add(long x,long y);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
在jni中由插件自动生成了一个NDKDemo.cpp和一个Android.mk我又添加了一个NDKDemo.h文件
在NDKDemo.cpp:
#include "NDKDemo.h"
jlong Java_com_example_ndkdemo_MainActivity_add( JNIEnv *env,jobject this,
jlong x,jlong y)
{
return x+y;}
在NDKDemo.h:#include <jni.h>
#ifndef NDKDEMO_H_
#define NDKDEMO_H_extern "C"{
jlong Java_com_example_ndkdemo_MainActivity_add( JNIEnv* env,jobject this,jlong x,jlong y);}#endif
在Andriod.mk:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := NDKDemo
LOCAL_SRC_FILES := NDKDemo.cppinclude $(BUILD_SHARED_LIBRARY)
错误信息:
Description Resource Path Location Type
expected ',' or '...' before 'this' NDKDemo.h /NDKDemo/jni line 7 C/C++ Problem
'y' was not declared in this scope NDKDemo.cpp /NDKDemo/jni line 7 C/C++ Problem
make: *** [obj/local/armeabi/objs/NDKDemo/NDKDemo.o] Error 1 NDKDemo C/C++ Problem
'x' was not declared in this scope NDKDemo.cpp /NDKDemo/jni line 7 C/C++ Problem
expected ',' or '...' before 'this' NDKDemo.cpp /NDKDemo/jni line 2 C/C++ Problem
C++Native App
解决方案 »
- 请问对android数据库了解的朋友 关于android数据库 SQLITE
- Android socket传输
- 这个函数里面的语句怎么理解?
- JNI:封装Android中Canvas类下的drawBitmap()函数问题请教!
- 请教andriod 2.2 自带浏览器的JS问题
- android中怎么使用控件(如textview)按移动轨迹移动
- 求助:请大神帮忙分析下这个运行日志
- 手机短信如何加入像网页段的超链接
- 求助!!下载打开PDF的时候怎么屏蔽系统默认调用的QQ
- Andorid上下文菜单
- 没有Activity, 只有BroadcastReceiver和Service的程序,能运行,但不能断点调试?
- 在service中 如何获取调用startService的 Context
Android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := a
### Add all source file names to be included in lib separated by a whitespace
LOCAL_SRC_FILES := a.cppinclude $(BUILD_SHARED_LIBRARY)
a.cpp
#include <string.h>
#include <jni.h>
如果我不用这个插件,而是手工建立jni目录、Android.mk和a.c的话一般是能编译的,但是看别人用插件也能编译成功的。例如这个例子:
http://pan.baidu.com/share/link?shareid=1651117078&uk=253361741
hello-jni.h
#include <jni.h>extern "C"{
JNIEXPORT jlong Java_com_example_hellojni_HelloJni_add(JNIEnv* env,jobject thiz,jlong x,jlong y);
}
hello-jni.cpp#include "hello-jni.h"JNIEXPORT jlong Java_com_example_hellojni_HelloJni_add( JNIEnv* env,jobject thiz,jlong x,jlong y)
{
return x+y;
}mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.cppinclude $(BUILD_SHARED_LIBRARY)
比如: javah -classpath bin/classes -d jni com.example.led.LED